如何枚举Qt中的所有QObject类

How to enumerate all QObject classes in Qt?

本文关键字:QObject Qt 何枚举 枚举      更新时间:2023-10-16

是否有方法枚举应用程序或DLL中声明的所有QObject类?我正在尝试创建一个加载DLL并列出DLL中所有QObject类的应用程序。

更新:实际上我正在尝试创建一个单元测试GUI。它将加载DLL,实例化里面的QObject,并针对它们调用QTest::qExec。

如果程序代码没有被剥离,您可以通过读取二进制文件来获得一些直观的结果: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;
 }