Qt中的包装连接方法隐藏了编译器所需的信息
Wrapping connect method in Qt hides information needed by compiler
我想包装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是没有用的。阅读文档时要更加小心(如果您这样做了(。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- Qt中的包装连接方法隐藏了编译器所需的信息
- 在Bazel中显示编译器信息
- 编译器在遇到提取或插入运算符时处理信息(字符串、操纵器等)的顺序是什么?
- C++在编译器错误中缺少信息
- 编译器不可知的运行时类型信息
- 编译器如何以及在内存中的何处存储有关变量类型的信息
- 这个关于类模板中静态信息的编译器错误意味着什么
- 告诉编译器不要为标准库生成调试信息
- 编译器是否可以基于命名空间生成调试信息
- 如何将范围信息传递给c++编译器
- 如何在MSBuild中定制c++编译器错误信息
- 为什么sun C++编译器在使用调试信息进行编译时会更改符号名称
- 为什么编译器在编译期间不评估 constexpr 函数,当每个信息都给出时?
- 我可以向编译器查询有关 C++0x "alignas"支持的信息吗?
- 程序中的编译器信息
- 如何在linux中查看.o文件的信息和编译器标志
- 视觉 C++标准是否指定编译器的 STL 实现详细信息
- 编译器对此指针和虚函数的详细信息
- 编译器对此指针、虚函数和多重继承的详细信息