QThread 没有实现 运行 方法

QThread without implementing run method

我对 (pyqt) 中的 QThreads 有一个奇怪的问题。 我通过实现 运行 方法和 运行 在其中无限循环来测试 QThread。它不影响主线程 (gui)。但是当我发出信号时 就像下面的伪代码一样,任何长 运行ning 循环或 i/o 都会影响主线程并使 gui 冻结。

class MyThread(QThread):
    def __init__(self , *args):
        QThread.__init__(self , *args)
        self.connect(self , SIGNAL("do_some_io(QString)") , self.doSomething)

    def doSomething(self ,  params):
        #do some large i/o and loops
        parent.emit( SIGNAL("process_done()") )


class MyDialog(QDialog):
    def __init__(self , *args):
        QThread.__init__(self , *args)
        self.Thread = MyThread(self)
        self.Thread.start()
        self.connect(self.btn , SIGNAL("clicked()") , self.buttonClicked)
        self.connect(self , SIGNAL("process_done()") , self.showMsgBox)

    def buttonClicked(self):
        self.Thread.emit( SIGNAL("do_some_io(QString)") , "param" )

    def showMsgBox(self):
        #show messagebox

这是因为当您发出 do_some_io 时,doSomething 是在 GUI 线程中执行的。在您的连接调用中,您需要将连接类型设置为 QueuedConnection。这将导致消息作为事件添加到接收线程事件队列中,然后它将 运行 接收线程而不是发送线程中的信号。

参见:http://doc.qt.io/qt-5/qt.html#ConnectionType-enum