信号槽

【Qt笔记】信号槽

倾然丶 夕夏残阳落幕 提交于 2019-12-04 03:55:03
信号槽是 Qt 框架引以为豪的机制之一。 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一个函数(成为槽(slot))来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。 (这里提一句,Qt 的信号槽使用了额外的处理来实现,并不是 GoF 经典的观察者模式的实现方式。) 为了体验一下信号槽的使用,我们以一段简单的代码说明: // !!! Qt 5 #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton button("Quit"); QObject::connect(&button, &QPushButton::clicked, &QApplication::quit); button.show(); return app.exec(); } 我们按照前面文章中介绍的在 Qt Creator 中创建工程的方法创建好工程

【Qt笔记】自定义信号槽

℡╲_俬逩灬. 提交于 2019-12-03 01:01:18
上一节我们详细分析了 connect() 函数。使用 connect() 可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。这也是 Qt 框架的设计思路之一,用于我们设计解耦的程序。本节将讲解如何在自己的程序中自定义信号槽。 信号槽不是 GUI 模块提供的,而是 Qt 核心特性之一。因此,我们可以在普通的控制台程序使用信号槽。 经典的观察者模式在讲解举例的时候通常会举报纸和订阅者的例子。有一个报纸类 Newspaper ,有一个订阅者类 Subscriber 。 Subscriber 可以订阅 Newspaper 。这样,当 Newspaper 有了新的内容的时候, Subscriber 可以立即得到通知。在这个例子中,观察者是 Subscriber ,被观察者是 Newspaper 。在经典的实现代码中,观察者会将自身注册到被观察者的一个容器中(比如 subscriber.registerTo(newspaper) )。被观察者发生了任何变化的时候,会主动遍历这个容器,依次通知各个观察者( newspaper.notifyAllSubscribers() )。 下面我们看看使用 Qt 的信号槽,如何实现上述观察者模式。注意,这里我们仅仅是使用这个案例,我们的代码并不是去实现一个经典的观察者模式。也就是说