qt6 connect函数调用中使用SIGNAL、SLOT宏 和 使用成员函数指针的区别及原理

本文详细分析了Qt中使用SIGNAL和SLOT宏以及函数指针连接信号与槽时的区别。在使用SIGNAL/SLOT宏时,即使参数不匹配也能编译通过,但可能在运行时出错;而使用函数指针方式则会在参数不匹配时直接导致编译错误。此外,宏方式可以显式指定重载版本,而函数指针方式易引发二义性冲突。总结来说,函数指针方式需确保无重载,宏方式则更为灵活但需注意运行时异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

用过qt信号与槽机制的人应该都知道,qt中connect函数可以有两种写参数的方式,第一种是SIGNAL()和SLOT()宏,第二种是&App::member 函数指针,昨天突然发现有时候用第二种方式编译会报错

no matching member function for call to 'connect'

用第一种宏函数的时候就不会报错,并且能编译通过,因此对这两种方式做了一下区分

一、先说结论

第一种用SIGNAL和SLOT宏的方式,信号函数参数列表数量小于槽函数参数列表数量的情况下 可以通过编译,但是会运行时报错

qt.core.qobject.connect: QObject::connect: Incompatible sender/receiver arguments

同时,使用宏函数的方式可以显式指定信号与槽函数的重载版本
并且此方式无需考虑类的继承关系,编译器智能识别基类的槽函数


第二种用&App::member 函数指针的方式,信号函数参数列表数量小于槽函数参数列表数量的情况下 不可以通过编译,同时会显示报错

no matching member function for call to 'connect'

使用函数指针的方式,无法指定信号与槽函数的重载版本,如果函数有重载,则会产生二义性冲突

二、错误原因及原理

1.SIGNAL和SLOT宏的工作原理

宏函数将信号和槽函数转换为const char *类型的字符串,并调用connect的如下重载版本

QMetaObject::Connection QObject::connect(const QObject *sender, const char 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值