2

アプリケーションまたは DLL で宣言されたすべての QObject クラスを列挙する方法はありますか? DLL をロードし、DLL 内のすべての QObject クラスを一覧表示するアプリケーションを作成しようとしています。

更新: 実際には、単体テスト GUI を作成しようとしています。DLL をロードし、内部で QObject をインスタンス化し、それらに対して QTest::qExec を呼び出します。

4

1 に答える 1

3

プログラム コードが削除されていない場合は、バイナリを読み取ることで内部観察を行うことができます objdump -demangle=C++ -t SomeQtLibrary.so |grep qt_static_metacall。QObject 派生クラスを大まかに示しています。それらはすべてこのシンボルを実装していると思います。nmもちろん、Windows を使用しているため、 (間違っていたら訂正してください)などの 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 docs のスニペットです (に変更さif(id == 0)れていif(id)ます)。

 int id = QMetaType::type("MyClass");
 if (id) {
     void *myClassPtr = QMetaType::construct(id);
     ...
     QMetaType::destroy(id, myClassPtr);
     myClassPtr = 0;
 }
于 2011-10-06T15:50:17.143 に答える