无法为另一个线程中的对象发送已发布的事件

时间:2014-02-02 08:07:46

标签: python qt qt4 pyqt pyqt4

当我尝试从线程使用一个QDialog对象时,我收到此错误。 这是我正在使用的代码:

import threading
import test_qdialog
from PyQt4 import QtGui, QtCore


class MyThread(threading.Thread):
    def __init__(self, id, window, mutex):
        self.id = id
        self.window = window
        self.mutex = mutex
        super(MyThread, self).__init__()

    def run(self):
        with self.mutex:
            result = self.window.exec_()
            if result == QtGui.QDialog.Accepted:
                print "Thread %d: %s" % (self.id, self.window.message_input.text())


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)

    mutex = threading.Lock()
    threads = []
    window = test_qdialog.MyDialog()

    for i in range(5):
        thread = MyThread(i, window, mutex)
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()

    sys.exit(app.exec_())

正如this回答的那样,如果我做对了,我不能这样做。但是我怎么能这样做呢?

1 个答案:

答案 0 :(得分:2)

您只能在主线程上创建和使用GUI小部件(我知道的每个UI库都是这样)。但是,您可以使用QtCore.QtThread轻松地将信号从线程传递到main。例如,请参阅PyQt threads and signals - how to properly retrieve values的答案(即使答案不是OP所寻求的,它与您的情况相关)。也可能会发现this SO post有用。

因此,不是从线程创建或访问对话框,而是从线程发出信号,并将主窗口连接到它,在接收信号时创建对话框。 Qt负责在线程之间传输数据。会像魅力一样工作。

绝对要密切关注Qt Threading Basics,如果你还没有(如果有的话,可能想发布有关你不理解的部分的问题,那么那里的重要信息)。