PySide QThread和QProgressBar

时间:2013-06-24 03:10:01

标签: python multithreading qt user-interface pyside

我在使用PySide进行GUI编程方面有点新,在Python GUI中也是如此。 我正在尝试使用线程设置进度条值,但它不起作用,并且会出现这些错误:

 QPixmap: It is not safe to use pixmaps outside the GUI thread 

 QWidget::repaint: Recursive repaint detected 

当我尝试与gui中的另一个小部件进行交互时,程序突然崩溃。


以下不是实际代码,它只是模拟我想要做的事情:

from PySide.QtGui import *
from PySide.QtCore import *​​
import os, time, platform, sys
class main(QDialog):
    def __init__(self, parent = None):
        super(main, self).__init__(parent)
        self.resize(300, 100)
        self.setMinimumSize(QSize(300, 100))
        self.setMaximumSize(QSize(300, 100))
        self.setWindowTitle("Test")
        self.buttonStart = QPushButton("Start")
        self.progressBar = QProgressBar()
        self.gridLayout = QGridLayout(self)
        self.setLayout(self.gridLayout)
        self.gridLayout.addWidget(self.progressBar, 0, 0, 1, 1)
        self.gridLayout.addWidget(self.buttonStart, 0, 1, 1, 1)
        self.connect(self.buttonStart, SIGNAL("clicked()"), self.startProgress)
        self.genericThread = GenericThread(self.test)
    def startProgress(self):
        self.genericThread.start()
    def test(self):
        print "started"
        for i in range(100):
            time.sleep(0.3)
            print i
            self.progressBar.setValue(i)
        print "done"
class GenericThread(QThread):
    def __init__(self, function, *args, **kwargs):
        QThread.__init__(self)
        self.function = function
        self.args = args
        self.kwargs = kwargs
    def run(self):
        self.function(*self.args,**self.kwargs)
        return
app = QApplication(sys.argv)
start = main()
start.show()
app.exec_()

因此,GenericThread应该运行在线程中传递给它的任何函数,而不是为每个函数创建一个线程。我知道我应该使用信号来使一个线程更改gui线程中的一个小部件,但实际上我没有将它应用于这个线程类。我试图将信号添加到测试函数,并将其连接到主类,但它没有做任何事情。

那我该怎么办?我不想更改线程类GenericThread,因为实际代码有许多需要在不同线程中运行的函数,同时我需要向用户显示线程的进度。

1 个答案:

答案 0 :(得分:0)

使用gui线程的信号让它更新进度条和/或绘制Pixmap。

当您连接该信号时,请确保告诉它使用Qt::QueuedConnection,而不是Qt::AutoConnection

http://doc.qt.io/qt-4.8/qt.html#ConnectionType-enum

http://doc.qt.io/qt-4.8/qobject.html#connect

http://doc.qt.io/qt-4.8/qcoreapplication.html#processEvents

希望有所帮助。