C++ 在Qt中包装connect方法隐藏编译器所需的信息

C++ 在Qt中包装connect方法隐藏编译器所需的信息,c++,qt5,signals-slots,qobject,C++,Qt5,Signals Slots,Qobject,我想包装qtconnect方法(Qt5语法),但无法编译代码。我能想到的最简单的例子是(没有经过测试,只是一般的想法): 当我试图编译它时,我在调用doConnect的行上得到一个错误 “调用doConnect没有匹配的函数” 在连接线上 错误:静态断言失败:信号和插槽参数不正确 兼容 听起来信号和插槽的参数不同/不兼容。但是,如果我通过在connect命令中放置sender对象/信号和receiver对象/插槽来直接调用connect,它就可以正常工作。所以这不是信号/插槽问题的特征 这里怎么

我想包装qtconnect方法(Qt5语法),但无法编译代码。我能想到的最简单的例子是(没有经过测试,只是一般的想法):

当我试图编译它时,我在调用doConnect的行上得到一个错误

“调用doConnect没有匹配的函数”

在连接线上

错误:静态断言失败:信号和插槽参数不正确 兼容

听起来信号和插槽的参数不同/不兼容。但是,如果我通过在connect命令中放置sender对象/信号和receiver对象/插槽来直接调用connect,它就可以正常工作。所以这不是信号/插槽问题的特征


这里怎么了?将参数传递给函数是否首先隐藏了connect函数(或宏或模板)所需的某些信息

对我来说,以下方法很有效:

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,信号(“remove(int)”),obj2,SLOT(“handleRemove(QString)”);
只需使用此连接,您将在运行时而不是编译时收到错误

这与:
QObject::connect(obj1和C1::remove、obj2和C2::HandlerRemove);

你会得到同样的错误,因为是的,int不是QString。简单而快速。同样的道理也适用于参数的数量,如果有更多或更少的参数,你可以通过它


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

如果能看到实际调用以及作为信号和插槽传递的函数的确切签名,那就太好了。问题是,当使用相同的参数直接调用时,connect可以正常工作。为什么使用中间函数会突然导致签名不兼容?您的答案并没有解决这一问题,只是提供了一个简单的解释对签名兼容性的认可。
void doConnect(const QObject* senderObject, const QMetaMethod& senderSignal, const QObject* receiverObject, const QMetaMethod& receiverSlot)
{
    QObject::connect(senderObject, senderSignal, receiverObject, receiverSlot);
}