C++ 如何枚举Qt中的所有QObject类?

C++ 如何枚举Qt中的所有QObject类?,c++,qt,qobject,C++,Qt,Qobject,是否有方法枚举应用程序或DLL中声明的所有QObject类?我正在尝试创建一个加载DLL并列出DLL中所有QObject类的应用程序 更新:实际上我正在尝试创建一个单元测试GUI。它将加载DLL,实例化内部的QObject,并针对它们调用QTest::qExec。如果程序代码没有被剥离,您可以通过读取二进制文件获得一些说明: objdump-demangle=C++-t SomeQtLibrary.so | grep qt_static_metacall它大致显示了QObject派生的类。我想他

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


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

如果程序代码没有被剥离,您可以通过读取二进制文件获得一些说明:
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**)
如果您对运行时内省感兴趣,那么就必须在每个对象上使用类

对于注册为(并且仅注册为!)的对象,您可以执行一些额外的魔法,使其具有生命。这不是很容易,也不是开箱即用的——但在这样一种静态语言中,这仍然是非常困难的。下面是Qt文档中的一个片段(将
if(id==0)
更改为
if(id)


你可以试着搞乱Moc,你是想列举DLL中使用的所有QObject的子类还是所有实例?@AndréPuel只列举所有QObject子类,而不是它们的实例。捕捉得好。但是,您不能总是从类名中分辨出它继承了哪些其他类,对吗?例如,如果我将从QObject继承的类抛出,它没有任何插槽,您将永远无法知道。谢谢,但是我如何实例化使用这种方式找到的类?很抱歉,在最初的问题中没有提到实例化。已更新,但它肯定超出了范围。再次感谢,它不应该是“if(id){”吗?无论如何,QMetaType::type应该有注册的类列表。我将跟踪它。这应该可以解决问题。很抱歉,由于我的声誉较低,无法升级:)
 int id = QMetaType::type("MyClass");
 if (id) {
     void *myClassPtr = QMetaType::construct(id);
     ...
     QMetaType::destroy(id, myClassPtr);
     myClassPtr = 0;
 }