Python 使用PySide/PyQt运行QThread时禁用元素

Python 使用PySide/PyQt运行QThread时禁用元素,python,qthread,pyside6,Python,Qthread,Pyside6,这是我点击OK按钮时得到的结果 但是我想在run\u action()仍在运行时禁用这两个按钮,并最终将栏重置为0 这是我当前的代码: 导入系统 导入时间 从PySide6.QtCore导入QThread,信号 从PySide6.QtWidgets导入( QApplication, QHBoxLayout, QProgressBar, QPushButton, QWidget, ) 类外部(QThread): progressChanged=信号(int) def运行(自): 进度=0 当进度

这是我点击OK按钮时得到的结果

但是我想在
run\u action()
仍在运行时禁用这两个按钮,并最终将
栏重置为0

这是我当前的代码:

导入系统 导入时间 从PySide6.QtCore导入QThread,信号 从PySide6.QtWidgets导入( QApplication, QHBoxLayout, QProgressBar, QPushButton, QWidget, ) 类外部(QThread): progressChanged=信号(int) def运行(自): 进度=0 当进度<100时: 进度+=10 时间。睡眠(1) self.progressChanged.emit(进度) 类窗口(QWidget): “”“主应用程序窗口。”“” 定义初始化(自): super()。\uuuu init\uuuuu() self.setWindowTitle(“示例”) self.layout=QHBoxLayout() self.layout.setContentsMargins(6,6,6,6) self.bar=QProgressBar() self.bar.setTextVisible(False) self.bar.setValue(0) self.layout.addWidget(self.bar) self.cancel\u btn=QPushButton(“取消”) self.cancel\u btn.clicked.connect(self.close) self.layout.addWidget(self.cancel\u btn) self.ok\u btn=QPushButton(“ok”) self.ok\u btn.clicked.connect(self.run\u操作) self.layout.addWidget(self.ok\u btn) self.setLayout(self.layout) def运行_操作(自身): self.ok\u btn.setEnabled(假) self.cancel\u btn.setEnabled(假) self.calc=外部() self.calc.progressChanged.connect(self.onProgressChanged) 自计算开始() self.cancel\u btn.setEnabled(真) self.ok\u btn.setEnabled(真) self.bar.setValue(0) def onProgressChanged(自身,值): self.bar.setValue(值) 如果名称=“\uuuuu main\uuuuuuuu”: app=QApplication(sys.argv) window=window() window.show() sys.exit(app.exec_())
void QThread::
已完成
()

该信号在相关线程完成执行之前从该线程发出

发出此信号时,事件循环已停止运行。 除延迟删除事件外,线程中将不再处理其他事件。 此信号可以连接到QObject::deleteLater(),以释放该线程中的对象

导入系统 #导入时间 #从PySide6.QtCore导入QThread,信号 从PyQt5.QtCore导入QThread,pyqtSignal #从PySide6.QtWidgets导入( 从PyQt5.QtWidgets导入( QApplication, QHBoxLayout, QProgressBar, QPushButton, QWidget, ) 类外部(QThread): #progressChanged=信号(int) progressChanged=pyqtSignal(int) def运行(自): 进度=0
如果要在任务完成后启用按钮并重置条形图,为什么要在启动线程后执行此操作?另外,既然您知道完成的最终值,您不能在
onProgressChanged()
中检查
value==100
,然后执行所需操作吗?
import sys
#import time

#from PySide6.QtCore import QThread, Signal
from PyQt5.QtCore import QThread, pyqtSignal

#from PySide6.QtWidgets import (
from PyQt5.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QProgressBar,
    QPushButton,
    QWidget,
)


class External(QThread):
#    progressChanged = Signal(int)
    progressChanged = pyqtSignal(int)

    def run(self):
        progress = 0
        while progress <= 100:
            self.progressChanged.emit(progress)
            self.msleep(500)
            progress += 10


class Window(QWidget):
    """The main application Window."""

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Example")

        self.layout = QHBoxLayout()
        self.layout.setContentsMargins(6, 6, 6, 6)

        self.bar = QProgressBar()
        self.bar.setTextVisible(False)
        self.bar.setValue(0)
        self.layout.addWidget(self.bar)

        self.cancel_btn = QPushButton("Cancel")
        self.cancel_btn.clicked.connect(self.close)
        self.layout.addWidget(self.cancel_btn)

        self.ok_btn = QPushButton("OK")
        self.ok_btn.clicked.connect(self.run_action)
        self.layout.addWidget(self.ok_btn)

        self.setLayout(self.layout)

    def run_action(self):
        self.ok_btn.setEnabled(False)        
        self.cancel_btn.setEnabled(False)        

        self.calc = External()
        self.calc.progressChanged.connect(self.onProgressChanged)
        self.calc.finished.connect(self.onFinished)                     # +++
        self.calc.start()

#        self.cancel_btn.setEnabled(True)
#        self.ok_btn.setEnabled(True)
#        self.bar.setValue(0)

    def onProgressChanged(self, value):
        self.bar.setValue(value)

    def onFinished(self):                                               # +++
        self.cancel_btn.setEnabled(True)
        self.ok_btn.setEnabled(True)
        self.bar.setValue(0)        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())