有没有办法枚举应用程序或 DLL 中声明的所有 QObject 类?我正在尝试创建一个加载 DLL 并列出 DLL 内的所有 QObject 类的应用程序。
更新:实际上我正在尝试创建一个单元测试 GUI。它将加载 DLL,实例化内部的 QObject,并针对它们调用 QTest::qExec。
最佳答案
如果程序代码没有被剥离,您可以通过阅读二进制文件进行一些内省(introspection):
objdump -demangle=C++ -t SomeQtLibrary.so |grep qt_static_metacall
它粗略地显示了 QObject 派生类。我认为他们都实现了这个符号。当然,由于您使用的是 Windows,因此您必须使用 Windows 工具,例如 nm
(如果我错了请纠正我)。当然,在代码中处理符号也是可能的,但这是一个单独的主题。
我提到的命令返回以下示例:
0000000000470c00 l F .text 0000000000000014 QxtBoundFunction::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
00000000004392ea l F .text 0000000000000158 MainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000453b5c l F .text 0000000000000091 QtLocalPeer::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000438508 l F .text 0000000000000014 MyApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000442cd0 l F .text 0000000000000080 MessagePoll::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000442ea2 l F .text 0000000000000091 RFBClient::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000467c3c l F .text 000000000000436a QxtRPCService::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000439114 l F .text 000000000000008f MemoryPolling::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
如果您对运行时自省(introspection)感兴趣,那么您必须使用 QMetaObject每个对象上的类。
对于注册为 QMetaType 的对象(而且只有这些!)您可以使用一些额外的魔法来使它们栩栩如生。不是很容易,也不是开箱即用的——但对于这样一种静态语言来说,它仍然是 hell 般的。这是 Qt 文档的片段(已将 if(id == 0)
更改为 if(id)
)。
int id = QMetaType::type("MyClass");
if (id) {
void *myClassPtr = QMetaType::construct(id);
...
QMetaType::destroy(id, myClassPtr);
myClassPtr = 0;
}
关于c++ - 如何枚举Qt中所有的QObject类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7676604/