【问题标题】:Cannot send posted events for objects in another thread无法为另一个线程中的对象发送发布的事件
【发布时间】:2014-02-25 19:40:53
【问题描述】:

当我尝试使用线程中的一个 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 回答中所写,如果我做对了,我不能这样做。但是那我该怎么做呢?

【问题讨论】:

  • 实际上 Qt 小部件不是线程安全的。
  • @fasked,没有解决方法吗?
  • 没有合法的解决方法。 Qt 文档明确表示只能从主线程访问小部件。
  • @DmitryMikhaylov 如果有帮助的话,我创建了一个不错的实用程序,它允许您在 Qt 应用程序的主线程中运行任意方法。因此,从一个线程中,您可以调用 inmain(widget.setText,my_text) 例如,然后它将一个事件发布到 MainThread 并运行您指定的方法。如果您有兴趣,请查看bitbucket.org/philipstarkey/qtutils。为 PySide 编写,但对您来说移植到 PyQt 应该很简单!
  • 谢谢@three_pineapples,我会试一试的。

标签: python qt qt4 pyqt pyqt4


【解决方案1】:

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

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

一定要仔细看看Qt Threading Basics,如果你还没有(如果你有,可能想就你不理解的部分发布问题,这里有的重要信息那里)。

【讨论】:

  • 实际上,我在主线程中创建了对话框。问题是我尝试从其他线程访问它。感谢您阅读的信息。
  • @DmitryMikhaylov 我也建议阅读:qt-project.org/doc/qt-4.8/threads-qobject.html
  • @DmitryMikhaylov 我的意思是创建或使用,同样的问题。我已经编辑过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2019-03-23
  • 2015-04-24
  • 2016-10-12
相关资源
最近更新 更多