信号和槽
- 用于两个对象之间的通信。
- 事件发射信号,槽函数响应信号。
- 通常的做法是子类化部件,然后添加自定义的信号和槽来实现。
- 信号与槽的关联,可以一对一、一对多、多对一,信号还可以与信号相关联。
- 类声明最开始处要添加 Q_OBJECT宏。
- 不支持对模板的使用。
优点:
- 类型安全,相关联的信号和槽的参数必须匹配。
- 松耦合。
- 可以使用任意类型的任意数量的参数。
信号
- 在类声明中,关键字signals前面不能用public 、protected、private限定符,其默认就是public。
- 信号只能声明,不需要定义。
- 没有返回值,只能是void类型。
- 发射信号要使用emit关键字。
槽
* 与普通函数的区别就是可以与信号关联*
关联
- 第一个参数为发射的对象
- 第二个参数为发射的信号
- 第三个参数为接收信号的对象
- 第四个参数为要执行的槽或信号
- 第五个参数为关联方式,默认是Qt::AutoConnection。
涉及带有参数的函数时,只写参数的类型,不能写变量名,多个变量时要一一对应,例如
connect(dlg,SIGNAL(dlgReturn(int)),this,SLOT(showValue(int)));
关联时connect(),函数名字写错,Qt Creator不报错!
这是因为Qt5之前的版本在指定信号和槽时必须使用SIGNAL()和SLOT()宏,最好用新的写法
connect(dlg,&myDialog::dlgReturn,this,&Widget::showValue);
这种写法支持拼写检查!
自动关联
形式:on_objectName _信号名
自动关联要在connectSlotsByName()函数之前进行部件的定义,这种方式不明了,不常用。
断开关联
disconnect()函数
用法:
- 1、断开与一个对象所有信号的所有关联
disconnect(myObject,0,0,0);
等价于
myObject->disconnect();
- 2、断开与一个指定信号的所有关联
disconnect(myObject,SIGNAL(mySignal()),0,0);
等价于
myObject->disconnect(SIGNAL(mySignal()));
- 3、断开与一个指定的receiver的所有关联
disconnect(myObject,0,myReceiver,0);
等价于
myObject->disconnect(myReceiver);
- 4、断开一个指定信号和槽的关联
disconnect(myObject,SIGNAL(mySignal()),myReceiver,SLOT(mySlot()));
等价于
myObject->disconnect(SIGNAL(mySignal()),myReceiver,SLOT(mySlot()));
等价于
myObject->disconnect(关联时connect()函数的返回值);
其他
QSignalMapper信号映射器,可以实现对多个相同部件的相同信号进行映射,为其添加字符串或者数值参数,然后发射出去。
百分号后面是数字一!!
setText(tr("number is:%1").arg(value))