为什么在PyQt中有信号和插槽?

2024-09-30 18:27:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习PyQt(我以前没有使用C++ QT)。在

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

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

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

当我能做到这一点时:

^{pr2}$

Tags: 方法代码selfui信号defconnect原因
3条回答

信号和插槽存在的原因是您不能从应用程序的任何其他线程(除了UI线程)更改GUI。在

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

做这种手术。您可以在单独的(后台工作线程)线程中执行它们,这样UI线程就可以继续更新GUI。在

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

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

嗯。。。是的,你可以。但你要想得更远。在示例代码中,mouseReleaseEvent的调用方必须具有对接收通知的对象的引用,并显式调用适当的方法。使用slot&signals机制可以将事件生产者(例如widget)与事件消费者(几乎任意的其他对象)分离。这使得建立通信和控制流变得更容易,并且在底层UI组件之外,这是件好事。它还使这些组件可重用-通过将连接代码移到外部,我们使其独立于应用程序逻辑。在

除了@ViktorKerkez和@Wilbur的答案之外,signals和slot还提供了一个fire-and-forget的通知系统,以及解耦类。在

这样做的一个很大的优点是类可以发出一个信号,而不知道谁或谁将接收到消息。它可能只是一个连接了插槽的对象,也可能是几十个。或者,您可能需要一个类,其中一个插槽连接到多个信号。所以它可以作为一个通知系统。在

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

相关问题 更多 >