QMetaObjectの使い方まとめ

QTにはQMetaObjectというオブジェクトのメタ情報を扱うクラスが用意されています。

メタ情報とは実行時型情報やプロパティ、関数などのことです。

ここではその使い方を少し紹介します。

クラス名と関数名の取得

これはC++にもある機能ですが、QMetaObjectではclassNameという関数を使うだけで実行時のクラス名を簡単に得ることが可能です。

QPushButton button;
qDebug() << "className = " << button.metaObject()->className();

この場合、クラス名として"QPushButton"という文字列が返ってきます。

同様に関数に関してもmethod関数から名前を取得することが可能です。

const QMetaObject * metaObj = button.metaObject();
for(int i = 0; i < metaObj->methodCount(); ++i){
    QMetaMethod metaMethod = metaObj->method(i);
    qDebug() << "method name = " << QString(metaMethod.name());
}

ただし、関数に関しては1つだけ注意があります。

それは取得できる関数はシグナルかスロットまたはQ_INVOKABLEマクロが指定されている関数に限るということです。これ以外の普通の関数は取得できないので注意です。

プラグインのインスタンス化

QMetaObjectのもう1つの使い方にQPluginLoaderで作ったプラグインをインスタンス化する使い方があります。

QPluginLoaderinstance関数を呼び出すとプラグインのインスタンスができますが、同時に1つまでしか作れません。つまり、2回目以降に呼び出すと先に作ったインスタンスが上書きされるということです。

この問題を回避するためにQMetaObjectnewInstance関数を使います。

例えば動的プラグインとしてMyWidgetというのを作ったとすれば次のようにして2つ以上のインスタンスを作成できます。

QPluginLoader pluginLoader("MyWidget");
QObject * srcPlugin = pluginLoader.instance();

QObject * plugin1 = srcPlugin->metaObject()->newInstance();
QObject * plugin2 = srcPlugin->metaObject()->newInstance();
///...

newInstanceを呼び出した場合はコンストラクタは呼ばれずにインスタンス化されます。

まとめ

ここで紹介した以外にもQMetaObjectにはプロパティを取得するなどいろいろな使い道があります。

もし、他に何か良い使い道が見つかればまた追加したいと思います。では、また!

関連項目
プライバシーポリシー