Python 使用PySide/PyQt运行QThread时禁用元素
这是我点击OK按钮时得到的结果 但是我想在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 当进度
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_())