信号槽连接和断开的几种常用形式

connect

一、使用SIGNAL()和SLOT()宏的形式:

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

1、创建从发送方对象中的信号到接收方对象中的方法的给定类型的连接。返回连接的句柄,稍后可用于断开连接。

2、指定信号和方法时,必须使用SIGNAL()和SLOT()宏,例如:

  QLabel *label = new QLabel;
  QScrollBar *scrollBar = new QScrollBar;
  QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));

3、signal和slots参数不能包含任何变量名,只能包含类型。

4、一个信号也可以连接另一个信号。

5、一个信号可以连接到多个槽和信号。多个信号可以连接到一个槽。

6、如果信号连接到多个槽,则在信号发出时,插槽的激活顺序与连接的顺序相同。

7、如果成功地将信号连接到槽,则该函数返回一个QMetaObject::Connection,表示连接的句柄。如果连接句柄无法创建连接,例如,如果QMetaObject无法验证信号或方法的存在等则该连接句柄将无效。

8、默认情况下,每一个连接发出一个信号,重复连接将发出两个信号。可以通过一次disconnect()调用来断开所有的重复连接。如果传递Qt::UniqueConnection类型,则只有在连接不是重复时才会进行连接。如果已经有重复的(同一对象上的同一插槽的信号完全相同),则连接将失败,connect将返回无效的QMetaObject::Connection。

注意:Qt::UniqueConnections不适用于lambdas、非成员函数和函数对象。仅适用于连接到成员函数。

9、参数5描述要建立的连接类型。特别地,它确定特定信号是立即发送到插槽,还是在排队等待处理。如果信号排队,参数必须是Qt元对象系统已知的类型,因为Qt需要复制参数以将它们存储在队列事件中。如果尝试使用排队连接并获得以下错误消息:

QObject::connect: Cannot queue arguments of type 'MyType'(Make sure 'MyType' is registered using qRegisterMetaType().)

 则在建立连接之前,调用qRegisterMetaType()注册数据类型。

二、函数指针的形式

[static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)

1、信号必须是在标头中声明为信号的函数。槽函数可以是可以连接到信号的任何成员函数。

2、如果信号的参数至少与槽的参数个数相同,并且信号中相应参数的类型与槽函数相应参数之间可以进行隐式转换。

三、非成员槽函数形式

[static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

1、函数可以是lambda表达式也可以是非成员函数。

2、信号槽的参数要求同上。

3、信号发送者被删除则连接失效。

disconnect

断开连接如果连接成功断开,则返回true;否则返回false。接收者或发送者被删除时,信号槽连接将被删除。
disconnect()通常有四种用法:

1、disconnect(myObject, nullptr, nullptr, nullptr);

断开连接到对象信号的所有连接。等价于:myObject->disconnect();

2、disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);

断开特定信号的所有连接。等价于:myObject->disconnect(SIGNAL(mySignal()));

3、disconnect(myObject, nullptr, myReceiver, nullptr);

断开与特定对象的所有连接,等价于:myObject->disconnect(myReceiver);

4、disconnect(lineEdit, &QLineEdit::textChanged,label,  &QLabel::setText);

断开与特定对象的特定连接(函数指针类型的连接专用),等价于:myObject->disconnect(lineEdit, &QLineEdit::textChanged,label,  nullptr);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值