我认为您可能会误会。您需要在单独的线程中进行工作,以免冻结应用程序。但是您还希望能够更新进度条。您可以通过使用创建工作人员类来实现此目的
QThread。QThread能够发出信号,您的UI可以侦听并采取适当的行动。
首先,让我们创建您的worker类。
#Inherit from QThreadclass Worker(QtCore.QThread): #This is the signal that will be emitted during the processing. #By including int as an argument, it lets the signal know to expect #an integer argument when emitting. updateProgress = QtCore.Signal(int) #You can do any extra things in this init you need, but for this example #nothing else needs to be done expect call the super's init def __init__(self): QtCore.QThread.__init__(self) #A QThread is run by calling it's start() function, which calls this run() #function in it's own "thread". def run(self): #Notice this is the same thing you were doing in your progress() function for i in range(1, 101): #Emit the signal so it can be received on the UI side. self.updateProgress.emit(i) time.sleep(0.1)
因此,既然您拥有一个工人阶级,就该利用它了。您将需要在您的
Ui_Dialog类中创建一个新函数来处理发出的信号。
def setProgress(self, progress): self.progressBar.setValue(progress)
在那里,您可以删除
progress()功能。
在
retranslateUi()您将要更新按钮事件处理程序从
self.pushButton.clicked.connect(self.progress)
至
self.pushButton.clicked.connect(self.worker.start)
最后,在您的
setupUI()函数中,您将需要创建worker类的实例,并将其信号连接到
setProgress()函数。
在这之前:
self.retranslateUi(Dialog)
添加:
self.worker = Worker()self.worker.updateProgress.connect(self.setProgress)
这是最终代码:
from PySide import QtCore, QtGuiimport timeclass 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.worker = Worker() self.worker.updateProgress.connect(self.setProgress) self.retranslateUi(Dialog) QtCore.QmetaObject.connectSlotsByName(Dialog) self.progressBar.minimum = 1 self.progressBar.maximum = 100 def retranslateUi(self, Dialog): Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnipreUTF8)) self.pushButton.setText(QtGui.QApplication.translate("Dialog", "PushButton", None, QtGui.QApplication.UnipreUTF8)) self.progressBar.setValue(0) self.pushButton.clicked.connect(self.worker.start) def setProgress(self, progress): self.progressBar.setValue(progress)#Inherit from QThreadclass Worker(QtCore.QThread): #This is the signal that will be emitted during the processing. #By including int as an argument, it lets the signal know to expect #an integer argument when emitting. updateProgress = QtCore.Signal(int) #You can do any extra things in this init you need, but for this example #nothing else needs to be done expect call the super's init def __init__(self): QtCore.QThread.__init__(self) #A QThread is run by calling it's start() function, which calls this run() #function in it's own "thread". def run(self): #Notice this is the same thing you were doing in your progress() function for i in range(1, 101): #Emit the signal so it can be received on the UI side. self.updateProgress.emit(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_())
QThreads具有一些内置信号,这些信号会自动发出。您可以在文档中看到它们以及有关QThreads的更多信息。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)