首页  >  文章  >  后端开发  >  如何在 PyQt 中的主窗口和线程之间安全地通信数据?

如何在 PyQt 中的主窗口和线程之间安全地通信数据?

Linda Hamilton
Linda Hamilton原创
2024-11-01 12:50:15322浏览

How can I safely communicate data between the main window and a thread in PyQt?

在 PyQt 中主窗口和线程之间通信数据

在 PyQt 应用程序中,常见的场景涉及在主窗口和线程之间共享数据线程,同时保持线程安全。以下是推荐的方法:

信号和槽:

  • 在线程类中声明自定义 Qt 信号,例如 beep()。
  • 将主窗口中的信号连接到更新相关小部件的插槽,例如, update().

示例:

<code class="python">class Worker(QtCore.QThread):
    beep = QtCore.pyqtSignal(int)

    def __init__(self, sleep_time):
        super(Worker, self).__init__()
        self.sleep_time = sleep_time

    def run(self):
        i = 0
        while True:
            i += 1
            self.beep.emit(i)
            time.sleep(self.sleep_time)

class MainWindow(QtGui.QWidget):
    def __init__(self):
        # ...
        self.worker = Worker(1)  # Initial sleep time
        self.worker.beep.connect(self.update)
        self.worker.start()

    def update(self, number):
        # Update widget with number
        self.output.display(number)</code>

注意事项:

  • Qt 小部件是不是线程安全的,只能从主程序访问线程。
  • 从多个线程访问时,全局变量可能无法按预期工作。

其他方法:

  • 传递主机窗口参考: 有风险,因为它依赖于 QObject 线程亲和力并可能导致竞争
  • 保持同步副本:需要保持主窗口和线程之间的一致性,这可能很复杂。

以上是如何在 PyQt 中的主窗口和线程之间安全地通信数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn