如何枚举Qt中的所有QObject类
How to enumerate all QObject classes in Qt?
是否有方法枚举应用程序或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;
}
相关文章:
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- QObject::d eleteLater在我的Qt测试中没有像预期的那样调用
- 具有 QObject 继承的单例 - Qt
- QT 库 QObject::connect: 无法连接 (null)::done() 到 MainWindow::upd
- Qt Quick + CMake + 自定义 QObject 导致对"vtable"的未定义引用
- 如何列出从Qt中Qobject继承的类的所有成员变量
- 删除 QObject 后 Qt 信号仍在触发
- .Qt :阻止 QObject 接收信号
- QObject::连接:QT上没有这样的插槽
- 如何在连接 lambda 时将 Qt::ConnectionType 传递给 QObject::connect
- Qt-Qml连接到上下文属性的QObject属性的信号
- 如何<double>从基于 QObject 的类方法返回 QList 以在 Qt 脚本中使用
- QT 请求"QObject::connect: No such slot BackEnd::RequestReceived"
- 如何通过QT中的参考为qobject进行分配
- 从另一个(非 qt)线程调用 QObject 方法的线程安全性?
- Qt QObject dynamic array
- Qt 是否可以安排在 QObject 被销毁时将 QObject* 设置为 nullptr
- Qt - 堆栈上具有父级的 QObject 如何被删除两次?
- 无法连接Qt QObject::connect()函数
- 传递带指针的QObject(Qt)