Как перечислить все классы QObject в Qt? - PullRequest
2 голосов
/ 06 октября 2011

Есть ли способ перечислить все классы QObject, объявленные в приложении или DLL? Я пытаюсь создать приложение, которое загружает DLL и перечисляет все классы QObject внутри DLL.

Обновление: на самом деле я пытаюсь создать GUI модульного теста. Он загрузит библиотеки DLL, создаст экземпляр объекта QObject внутри и вызовет для них QTest :: qExec.

1 Ответ

3 голосов
/ 06 октября 2011

Если программный код не удален, вы можете получить некоторый анализ, прочитав двоичный файл: 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**)

Если вас интересует самоанализ во время выполнения, вам придется играть с классом 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;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...