Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Qt信号与槽

介绍

信号与槽是Qt的核心特性,是对象间通信所采用的机制。
其是由Qt的元对象系统支持而实现的,所以要使用信号与槽机制须添加Q_OBJECT宏。
信号(signal)是在特定情况下被发射的通知。
(slot)是对信号进行响应的的函数。其为函数,可以正常被调用。与一般函数不同的是其可以通过**connect()**与信号关联,当信号被发射时会运行与之关联的槽函数。

关联信号与槽

信号与槽使用connect()进行关联。其为QObject的静态函数,格式如下:
connect(发送对象, &信号指针, 接收对象, &槽函数指针);
Qt还提供了SIGNAL与SLOT两个宏用来更方便的指明信号与槽函数,因此connect()也可以写成以下形式:
connect(发送对象, SIGNAL(信号), 接收对象, SLOT(槽));
对于connect()的使用还有以下规则:

  1. 一个信号可以连接多个槽函数,其会按照建立连接时的顺序依次执行。
  2. 多个信号可以连接同一槽函数。
  3. 一个信号可以连接另个信号。
  4. 信号与槽的数个参数类型需一致,信号参数不得少于槽的参数。
  5. 当信号被发射,与之关联的槽函数通常被立即运行,只有槽函数运行完毕后之后的代码才能运行。

解除关联

disconnect()用于解除关联,其有如下几种使用方式:
解除一个发射者的所有信号连接

1
2
3
4
//静态函数形式
disconnect(要解除信号的发送者, nullptr, nullptr, nullptr);
//成员函数形式
要解除信号的发送者->disconnect();

解除一个发射者特定信号的所有连接

1
2
3
4
//静态函数形式
disconnect(要解除信号的发送者, SIGNAL(信号), nullptr, nullptr);
//成员函数形式
要解除信号的发送者->disconnect(SIGNAL(信号));

解除与一个接收者所有信号的连接

1
2
3
4
//静态函数形式
disconnect(要解除信号的发送者, nullptr, 特定接收者, nullptr);
//成员函数形式
要解除信号的发送者->disconnect(特定接收者);

解除特定的连接
disconnect(发送者,(SIGNAL(信号),接收者,SLOT(槽))

获取信号发送者

在槽函数中可以调用sender()来获取信号发送者的QObject对象指针。
若知道其确切的类型可以使用
qobject_cast<T*>(sender())
来获取其类型的指针。

自定义信号发送

在自己设计的类中可以自定义信号。
在类的signals部分中定义信号。

1
2
3
4
class{
signals:
void 信号名(参数列表);
}

信号函数是无返回值的,但有输入参数。
信号函数无需实现,只需要在特定情况下被发射。
在需要发射信号时使用emit关键字。

1
2
//发射信号
emit 信号名(参数列表);

参考资料

Qt6 c++开发指南 人民邮电出版社

评论