当我尝试从线程使用一个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回答的那样,如果我做对了,我不能这样做。但是我怎么能这样做呢?
答案 0 :(得分:2)
您只能在主线程上创建和使用GUI小部件(我知道的每个UI库都是这样)。但是,您可以使用QtCore.QtThread轻松地将信号从线程传递到main。例如,请参阅PyQt threads and signals - how to properly retrieve values的答案(即使答案不是OP所寻求的,它与您的情况相关)。也可能会发现this SO post有用。
因此,不是从线程创建或访问对话框,而是从线程发出信号,并将主窗口连接到它,在接收信号时创建对话框。 Qt负责在线程之间传输数据。会像魅力一样工作。
绝对要密切关注Qt Threading Basics,如果你还没有(如果有的话,可能想发布有关你不理解的部分的问题,那么吨那里的重要信息)。