Qt信号和槽机制是一种用于处理事件和通信的重要机制。当一个特定事件发生时,比如用户点击按钮或者数据发生改变,一个对象会发出一个信号,当别的对象接收到这个信号后,执行相应的槽函数。
格式
旧格式
connect(sender,SIGNAL(signal),receiver,SLOT(slot));
sender:信号的发起者
signal:发出的信号名
receiver:信号的接收者
slot:接收信号被调用的槽函数
在写slot的时候函数名后需要+()
新格式
connect(sender, &SenderClass::signal, receiver, &ReceiverClass::slot);
新格式带来的好处:类型安全,且在编译时进行了静态检查
sender:信号的发起者
&SenderClass::signal:发送信号的类的名称+发出的信号名
receiver:信号的接收者
&ReceiverClass::slot:接收信号的类的名称+执行的槽函数
在写slot的时候不需要+()
信号的的定义与发出
定义:
signals:
信号函数
发出:emit 信号函数
信号函数
信号是一种特殊的成员函数,用于在特定事件发生时向连接到该信号的槽函数发出通知。信号并不包含实际的实现代码,而只是用于通知其他对象或组件发生了某个事件。因此,不需要实现函数体。
信号函数,可以有返回值,也可以有参数,因此可以重载。
一个信号可以链接多个槽函数,多个信号也可以链接一个槽函数
断开信号和槽的连接
关键字:disconnect
断开特定信号和槽的连接
和连接的写法一致。
disconnect(sender, &SenderClass::signalName, receiver, &ReceiverClass::slotName);
断开对象的所有信号和槽的连接
disconnect(sender);
断开特定信号的连接
disconnect(sender, &SenderClass::signalName);
connect
函数的第五个参数
可选参数,用于指定连接的类型。
Qt::AutoConnection:Qt默认的连接方式,信号和槽处于同一线程用该方式。
Qt::DirectConnection:当信号发生时,槽函数会在发送信号的线程中立即被调用。没有线程切换的开销
Qt::QueuedConnection:信号和槽处于不同线程时,事件会被放置到接收者对象的事件队列中,在接收者对象所属的线程中处理。
Qt::BlockingQueuedConnection:在信号发射的线程中,如果当前线程是接收者对象所属的线程,会直接调用槽函数;只有当信号和槽在不同线程中时,才会像 Qt::QueuedConnection 一样将信号放入目标线程的事件队列中等待执行。