クラス名を指定して、クラスの QMetaObject インスタンスを見つける方法はありますか? 私がやりたいことは、ディスクからオブジェクトをロードすることですが、これを行うには、QMetaObject を使用してインスタンスを作成するために、クラスの名前を使用して QMetaObject インスタンスを取得する方法が必要です。
5 に答える
QMetaTypeでこれを行うことができるはずです。あなたのタイプをQ_DECLARE_META_TYPE()
知らせる必要があるかもしれません。qRegisterMetaType()
次に、リンクからのこの例のように大まかに動作するはずです:
int id = QMetaType::type("MyClass");
if (id == 0) {
void *myClassPtr = QMetaType::construct(id);
...
QMetaType::destroy(id, myClassPtr);
myClassPtr = 0;
}
私は最近同じ問題に直面しています。クラス自体のインスタンスを作成することなく、メタオブジェクトが必要でした。私ができる最善の方法は、クラス名を指定して qmetaobject を取得するグローバル/静的関数を作成することです。QObject::staticMetaObject を使用してこれを実現しました。
QMetaObject GetMetaObjectByClassName(QString strClassName)
{
QMetaObject metaObj;
if (strClassName.compare("MyClass1") == 0)
{
metaObj = MyClass1::staticMetaObject;
}
else if (strClassName.compare("MyClass2") == 0)
{
metaObj = MyClass2::staticMetaObject;
}
else if (strClassName.compare("MyClass3") == 0)
{
metaObj = MyClass3::staticMetaObject;
}
else if (strClassName.compare("MyClass4") == 0)
{
metaObj = MyClass4::staticMetaObject;
}
else if (strClassName.compare("MyClass5") == 0)
{
metaObj = MyClass5::staticMetaObject;
}
// and so on, you get the idea ...
return metaObj;
}
参照: http://doc.qt.io/qt-5/qobject.html#staticMetaObject-var
誰かがより良いオプションを持っている場合は、共有してください!
あなたの場合、適切な解決策はQtプラグインメカニズムを使用することです。共有/ダイナミックライブラリを簡単にロードし、必要なインターフェイスの実装が含まれているかどうかを確認する機能を提供します。含まれている場合は、インスタンスを作成します。詳細はここで見つけることができます:Qtプラグインを作成する方法
必要な MetaClass インスタンスを Hash または Map に保存し、保存した名前で取得できます
QMetaType::metaObjectForType
関数を見ることもできます。
タイプの QMetaType::metaObject を返します
更新:それは私のコードです。クラス名でクラスを作成します。(クラスはqRegisterMetaTypeに登録する必要があることに注意してください(またはQObjectベースです)
int typeId = QMetaType::type("MyClassName");
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId);
QObject *o = metaObject->newInstance();
MyClassName *myObj = qobject_cast<MyClassName*>(o);
更新 2:言うのを忘れていました。Yout クラスのコンストラクターはQ_INVOKABLEとしてマークする必要があります