Qt中的包装连接方法隐藏了编译器所需的信息

Wrapping connect method in Qt hides information needed by compiler

本文关键字:编译器 信息 方法 包装 连接 Qt 隐藏      更新时间:2023-10-16

我想包装Qt连接方法(Qt5语法(,但无法编译我的代码。 我能想出的最简单的例子是(没有测试,只是一般的想法(:

// Called like this 
doConnect(&obj1,&obj1:sig,&obj2,&obj2::slot);
// Implemented here
void namespace::doConnect(
const QObject* senderObject, 
const QMetaMethod& senderSignal, {
const QObject* receiverObject, 
const QMetaMethod& receiverSlot) {
connect(senderObject, senderSignal, receiverObject, receiverSlot);
}

当我尝试编译它时,我在调用doConnect的行上出现错误,

"调用doConnect没有匹配功能">

并在连接线上

错误:静态断言失败:信号和插槽参数不是 相容。

听起来信号和插槽具有不同/不兼容的参数。 但是,如果我通过将发送方对象/信号和接收方对象/插槽放在连接命令中来直接调用连接,它可以正常工作。 所以这不是信号/插槽问题的签名。

这是怎么回事? 将参数传递给函数是否首先隐藏连接函数(或宏或模板(所需的某些信息?

对我来说,以下内容效果很好:

void doConnect(const QObject* senderObject, const QMetaMethod& senderSignal, const QObject* receiverObject, const QMetaMethod& receiverSlot)
{
QObject::connect(senderObject, senderSignal, receiverObject, receiverSlot);
}

您已经从编译器编写了"信号和插槽参数不兼容"。这并不奇怪。您可以尝试执行以下操作:QObject::connect(&obj1,&obj1:sig,&obj2,&obj2::slot);

你会得到同样的!函数签名不兼容。例如:QObject::connect(obj1, SIGNAL("remove(int)"), obj2, SLOT("handleRemove(QString)");只是通过此连接,您将在运行时而不是在编译时收到错误。

它与:QObject::connect(obj1, &C1::remove, obj2, &C2::handleRemove);

你会遇到同样的错误,因为是的,int 不是 QString。简单快捷。这同样适用于参数的数量,如果参数数量或多或少,您可以完成。

此外,创建一个与QObject::connect相同的函数doConnect是没有用的。阅读文档时要更加小心(如果您这样做了(。