有没有办法枚举在应用程序或DLL中声明的所有QObject类?我正在尝试创建一个加载DLL的应用程序,并列出DLL中的所有QObject类。
更新:实际上我正在尝试创建一个单元测试GUI。它将加载DLL,在其中实例化QObject,并对它们调用QTest :: qExec。
答案 0 :(得分:3)
如果程序代码没有被剥离,你可以通过阅读二进制文件来获得一些自省:
objdump -demangle=C++ -t SomeQtLibrary.so |grep qt_static_metacall
它大致显示了QObject派生类。我认为他们都实现了这个符号。因为你在Windows上,你必须使用nm
之类的Windows工具(如果我错了,请纠正我)。自然地处理代码中的符号也是可能的,但这是一个单独的主题。
我提到的命令返回了这个例子:
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**)
如果您对运行时内省感兴趣,则需要在每个对象上使用QMetaObject类。
对于注册为QMetaType的对象(只有那些!),你可以做一些额外的魔术来实现它们。不是很容易,也不是开箱即用 - 但是这种静态语言仍然存在很多问题。以下是Qt文档的片段(已将if(id == 0)
更改为if(id)
)。
int id = QMetaType::type("MyClass");
if (id) {
void *myClassPtr = QMetaType::construct(id);
...
QMetaType::destroy(id, myClassPtr);
myClassPtr = 0;
}