准备工作
pip install PySide6 pyqtdarktheme
代码
from PySide6.QtCore import *
from PySide6.QtWidgets import *
from PySide6.QtGui import QFont
from qdarktheme import load_stylesheet
from time import sleep
import sys
def work(a, b):
print("正在执行耗时操作,不会阻塞界面。。。")
sleep(4)
return a + b
class WorkThread(QThread):
s_start = Signal()
s_print = Signal(str)
s_end = Signal()
def __init__(self, parent):
super().__init__(parent)
def run(self):
main_form: MainForm = self.parent()
self.s_start.emit()
work(3, 6)
self.s_print.emit("任务完成!!")
self.s_end.emit()
class MainForm(QWidget):
def __init__(self, *args, **kargs):
super().__init__(*args, **kargs)
self.init_ui()
def init_ui(self):
self.setWindowTitle("标题")
# 创建左侧的 RadioButton
l_left = QVBoxLayout()
l_left.setAlignment(Qt.AlignTop)
l_left.addWidget(QLabel(self, text="左侧列"))
for b in ["按钮1", "按钮2"]:
radio_button = QRadioButton(b)
l_left.addWidget(radio_button)
# 创建右侧的 Checkbox
l_right = QVBoxLayout()
l_right.setAlignment(Qt.AlignTop)
l_right.addWidget(QLabel(self, text="右侧列"))
for e in ["选择框1", "选择框2"]:
checkbox = QCheckBox(e, checked=False)
l_right.addWidget(checkbox)
# 创建底部的按钮
l_ctrl = QHBoxLayout()
self.w_checkmode = QCheckBox("调试模式", checked=True)
self.w_OK = QPushButton("开始", self)
self.w_OK.clicked.connect(self.click_OK)
w_quit = QPushButton("退出", self)
w_quit.clicked.connect(self.close)
l_ctrl.addWidget(self.w_checkmode)
l_ctrl.addWidget(self.w_OK)
l_ctrl.addWidget(w_quit)
# 创建指示板
self.w_log = QLabel(self)
self.w_log.setAlignment(Qt.AlignLeft | Qt.AlignTop)
self.w_log.setFont(QFont("times", 12))
self.w_log_area = QScrollArea()
self.w_log_area.setWidgetResizable(True)
self.w_log_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.w_log_area.setFixedWidth(500)
self.w_log_area.setMinimumHeight(400)
self.w_log_area.setWidget(self.w_log)
# 创建主布局
l_sub_main = QHBoxLayout()
l_sub_main.setAlignment(Qt.AlignTop)
l_sub_main.addLayout(l_left)
l_sub_main.addLayout(l_right)
l_sub_main.addWidget(self.w_log_area)
l_main = QVBoxLayout()
l_main.addLayout(l_sub_main)
l_main.addLayout(l_ctrl)
self.setLayout(l_main)
def click_OK(self):
t = WorkThread(self)
t.s_start.connect(self.start_work)
t.s_print.connect(self.print)
t.s_end.connect(self.end_work)
t.start()
def start_work(self):
self.w_OK.setEnabled(False)
def end_work(self):
self.w_OK.setEnabled(True)
def print(self, s):
self.w_log.setText(self.w_log.text() + s + "\n")
self.w_log_area.setMinimumWidth(self.w_log.width() + 12)
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setFont(QFont("times", 16))
app.setStyleSheet(load_stylesheet("light"))
window = MainForm()
window.show()
sys.exit(app.exec())