信号槽
1、概念
信号和槽是两个函数,这是Qt在C++基础上新增的特性。类似于其他技术中的回调的概念。
信号槽通过程序员提前设定的“约定”,可以实现对象之间的通信,有两个先决条件。
● 通信的对象必须都是从QObject类中派生出来的。
● 类中要有Q_OBJECT宏。
2、函数原型
信号槽需要在使用前进行约定,这个约定也被称之为连接,使用connect函数进行连接。
// 参数1:发射者
// 参数2:信号函数,表示发射者发起的动作。SIGNAL()包裹。必须是发射者所属类内的函数
// 参数3:接收者
// 参数4:槽函数,表示接收者要履行的约定,使用SLOT()包裹。必须是接受者类内的函数!
connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method)
[static]
【注意】
1)信号函数必须是发射者所属类(或者发射者的基类)的成员函数;同理槽函数必须是接受者所属类(或接受者的基类)的成员函数!
2)connect()写两次,就是一次发射者的动作(信号函数),接受者两次执行槽函数!
第五个参数:
第五个参数type就是用来指定连接的类型。它可以是以下几种枚举值之一:
Qt::AutoConnection:Qt将自动选择连接类型。如果信号和槽在同一线程中,那么使用Qt::DirectConnection,否则使用Qt::QueuedConnection。
Qt::DirectConnection:直接连接。当信号发出时,槽函数会立即在发射信号的线程上被调用。这意味着如果信号和槽位于不同线程,那么可能会出现线程安全问题。
Qt::QueuedConnection:队列连接。当信号发出时,Qt会将事件放入接收对象的事件队列中,然后等待目标对象所在的线程处理该事件。因此,槽函数的执行将延迟到接收对象所在的线程中执行,这通常用于跨线程连接。
Qt::BlockingQueuedConnection:阻塞队列连接。与Qt::QueuedConnection类似,但是发送者将被阻塞,直到接收者处理完槽函数为止。
Qt::UniqueConnection:确保每个连接只建立一次,避免重复连接。
connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)
【注意】
1)参数五:
跨线程:队列链接
同线程:直接链接
3、实现方式
为了学习,把信号槽分为三种实现方式:
● 自带信号→自带槽
● 自带信号→自定义槽
● 自定义信号
(一)自带信号→自带槽
(二)自带信号→自定义槽
Qt不可能内置所有执行的动作代码,特别是复杂的动作,需要开发者手动编写槽函数,这种方式也是所有连接方式中使用最多的。
槽函数实际上是一种特殊的成员函数,在声明的时候权限的作用主要是修饰其作为普通成员函数的使用效果,不影响信号槽的连接效果。
【注意】
1)自定义的槽函数:不可以只写声明,不实现,会直接报错的。