我有这个密码:
from PySide import QtCore, QtGui
import time
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 133)
self.progressBar = QtGui.QProgressBar(Dialog)
self.progressBar.setGeometry(QtCore.QRect(20, 10, 361, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.pushButton = QtGui.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(20, 40, 361, 61))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("Dialog", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
self.progressBar.setValue(0)
self.pushButton.clicked.connect(self.progress)
def progress(self):
self.progressBar.minimum = 1
self.progressBar.maximum = 100
for i in range(1, 101):
self.progressBar.setValue(i)
time.sleep(0.1)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
我想把进度条放在一个单独的线程中,这样它就不会冻结应用程序,但我似乎找不到这样做的方法。
有人能帮忙吗?
我想你可能弄错了。你需要在一个单独的线程中完成工作,这样它就不会冻结应用程序。但您也希望能够更新进度条。您可以通过使用
QThread
创建工作类来实现这一点。qthread能够发出信号,用户界面可以监听这些信号并采取适当的操作。首先,让我们创建你的工人阶级。
现在你有了工人阶级,是时候利用它了。您需要在
Ui_Dialog
类中创建一个新函数来处理发出的信号。在那里时,可以删除
progress()
函数。在
retranslateUi()
中,您将希望从到
最后,在
setupUI()
函数中,需要创建一个worker类的实例,并将其信号连接到setProgress()
函数。在此之前:
添加以下内容:
以下是最终代码:
QThreads有一些自动发出的内置信号。您可以看到它们,以及有关QThreadsin the documentation的更多信息
认为总是需要使用多线程来处理这样的事情是错误的。
如果您可以将长期运行的任务分解为一系列的小步骤,那么您所需要做的就是确保所有挂起的事件都得到足够频繁的处理,以便GUI保持响应。这可以通过使用processEvents从主GUI线程中的安全地完成,如下所示:
考虑到它的简单性,在选择更重的解决方案(如多线程或多处理)之前,至少应该考虑一下这种技术。
相关问题 更多 >
编程相关推荐