您的位置:首页 > 编程语言 > Qt开发

Qt笔记_信号和槽

2017-10-06 20:02 225 查看

信号和槽

用于两个对象之间的通信。

事件发射信号,槽函数响应信号。

通常的做法是子类化部件,然后添加自定义的信号和槽来实现。

信号与槽的关联,可以一对一、一对多、多对一,信号还可以与信号相关联。

类声明最开始处要添加 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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: