【问题标题】:Why Signals and Slots in PyQt?为什么在 PyQt 中使用信号和插槽?
【发布时间】:2013-09-05 06:05:47
【问题描述】:

我正在学习 PyQt(我之前没有使用过 C++ Qt)。

我不明白信号和插槽的原因。也就是说,似乎我可以通过直接调用类的方法来做任何事情。这样做看起来更 Pythonic,使用更少的代码并且更容易阅读。我错过了什么?

为了澄清,我问我为什么要这样做:

def mouseReleaseEvent(self):  
    self.clicksignal.connect(ui.iconClicked) 
    self.clicksignal.emit()

什么时候可以做到:

def mouseReleaseEvent(self): 
    ui.iconClicked()

【问题讨论】:

    标签: python qt pyqt signals-slots qt-signals


    【解决方案1】:

    信号和槽存在的原因是因为除了 UI 线程之外,您无法从应用程序的任何其他线程更改 GUI。

    如果您有一些繁重的 CPU 密集型计算要做,或者任何等待 IO 的任务或类似的事情......如果您在 UI 线程中执行(例如,如果您获取一个 url 或持续一段时间的东西) ,您的 UI 线程将很忙,并且 GUI 事件循环将无法自行更新,因此 GUI 看起来会冻结。

    做这些操作。您可以在单独的(后台工作人员)线程中执行它们,因此 UI 线程可以继续更新 GUI。

    现在的问题是您无法访问 GUI 的元素并从除 UI 线程之外的任何其他线程更改它们的状态。所以引入了信号和槽。当你发出一个信号时,它保证会在 UI 线程中被捕获,并且 slot 将在 UI 线程中执行。

    我不确定您在示例中尝试完成什么,但这是信号和插槽存在的主要原因。基本上,UI 线程应该只处理 UI,其他所有事情都应该在后台工作线程中完成,该线程发送一个信号,该信号被 UI 线程捕获,更新 GUI 的插槽在 UI 线程中执行。

    【讨论】:

      【解决方案2】:

      嗯...是的,你可以。但你需要想得更大。在您的示例代码中,mouseReleaseEvent 的调用者必须具有对接收通知的对象的引用,并显式调用适当的方法。使用插槽和信号机制将事件生产者(例如小部件)与事件消费者分离 - 几乎是任意其他对象。这使得设置通信和控制流更容易并且在低级 UI 组件外部,这是一件好事。它还使此类组件可重用 - 通过将接线代码移到外部,我们使其独立于应用程序逻辑。

      【讨论】:

        【解决方案3】:

        除了@ViktorKerkez 和@Wilbur 的答案之外,信号和插槽还提供了一个触发后忘记的通知系统,以及解耦类。

        这样做的一个很大的好处是一个类可以发出一个信号,而不知道什么或谁会接收到这个消息。它可能只是一个连接了插槽的对象,也可能是几十个。或者,您可能需要一个具有一个连接多个信号的插槽的类。所以它可以用作通知系统。

        例如,想象一个程序,其中许多不同类型的对象将信息发送到日志。这些对象只是发出一个 Log(text) 信号,而不关心实际记录的内容。这些信号可以连接到一个日志类,该类可以记录到文件、通过网络、屏幕或一次全部记录。记录的对象不在乎。

        【讨论】:

          猜你喜欢
          • 2012-07-13
          • 2011-12-13
          • 2011-08-08
          • 1970-01-01
          • 1970-01-01
          • 2011-11-23
          • 2011-08-16
          • 1970-01-01
          • 2016-11-22
          相关资源
          最近更新 更多