如何在编译期间检查信号/插槽连接?
How can I do a check of the signal/slot connect's during compilation?
在运行时检查Qt信号槽连接调用对我来说是一个问题。我应该能够对connect语句进行静态检查。
这样的工具存在吗?
使用QT5可以使用以下语法,在编译时进行静态检查:
connect(sender, &Sender::signalMethod, receiver, &Receiver::slotMethod);
这样的工具存在吗?
如果这样的工具存在就好了,但不幸的是它不存在,因为信号/插槽机制在qt中实现的方式,而且,由于这个原因,不可能静态地检查信号是否适合插槽。
如果qt使用类似boost的信号/插槽,这是可能的。
您可以考虑用C编写一个GCC插件,或者一个MELT扩展,MELT是一种特定于领域的语言,可以很容易地编写GCC扩展。使用插件或MELT扩展,您可以分析内部表示(特别是表示c++类&函数声明),并为此创建一个特定的工具。
然而,扩展GCC需要理解其相当复杂的内部表示,对于不了解GCC内部表示的人来说,这将需要一个多星期的努力。
也许这样的努力是不值得的,除非你的Qt应用程序真的很大。如果您考虑在这方面与MELT合作,我很乐意帮助您。
我在我的代码中使用了这样的东西:
#define CONNECT_OR_DIE(source, signal, receiver, slot,connection_type)
if(!connect(source, signal, receiver, slot,connection_type))
qt_assert_x(Q_FUNC_INFO, "CONNECT failed!!", __FILE__, __LINE__);
我使用它来代替简单的connect()调用。它对你有帮助吗?
您不能在编译时检查这个,但是如果您在Qt Creator中以调试模式运行程序,如果connect
调用失败,它将在应用程序输出窗格中打印有用的诊断消息。
为了处理大型Qt4代码库,我编写了这样的检查器作为插件对于clang静态分析器
看:http://reviews.llvm.org/D14592
it测试覆盖率示例:
connect(&send, SIGNAL(f2(int, double*)), &recv, SLOT(bugaga(int, double*))); // expected-warning{{Can not find such slot}}
相关文章:
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- Qt moveToThread,带有参数的信号/插槽
- moc 文件中缺少信号插槽
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 信号/插槽多线程 Qt
- 通过排队的QT信号插槽连接发送QSHAREDPOINTERS的QVECTOR
- Qimage没有通过信号插槽QT
- 使用 Qt5 的新信号/插槽实现向滑块发出信号
- 一个类中的QT信号/插槽,但从不同的线程发出
- 信号/插槽基类多继承
- 在QT C 中使用QMOVIE和信号/插槽之间在GIF中导航
- 在 for 循环中使用 lambda 函数连接信号插槽
- 不同类别的 2 个对象之间的信号/插槽
- 如何正确使用qt的信号/插槽系统
- Qt信号插槽视觉工作室:似乎未连接
- QACTION信号插槽中的无形UI
- Qt-连接触发动作中的信号/插槽
- Qt 信号插槽类范围类型
- 信号/插槽 Qt5 C++