准备工作

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())