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

标签 c++ qt qobject

有没有办法枚举应用程序或 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/

相关文章:

c++ - QThread finish() 连接到 QObject 的删除

c++ - 在 C++ 中使用 miniz 将一个 vector 解压缩为另一个 vector

c++ - 为什么两个函数有相同的地址?

c++ - 如何评估 noexcept() 运算符的结果

python - PyQt:类对象删除,调用析构函数但内存未释放

qt - 从 QAbstractListModel 返回自定义 QObject 子类并在 ListView 中使用它

Visual Studio 2012 中的 c++ std::thread 问题

c++ - QT - QGraphicsScene 显示不正确(z 缓冲区?)

qt -/usr/bin/ld : cannot find -lfreetype Why? 我怎样才能让它工作?

c++ - 是否可以将模板派生的 C++ 类与 Qt 的 Q_OBJECT 混合使用?