Qt笔记_信号和槽

信号和槽

  • 用于两个对象之间的通信。
  • 事件发射信号,槽函数响应信号。
  • 通常的做法是子类化部件,然后添加自定义的信号和槽来实现。
  • 信号与槽的关联,可以一对一、一对多、多对一,信号还可以与信号相关联。
  • 类声明最开始处要添加 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))

你可能感兴趣的:(Qt)