QObjectリフレクションを使用して、オブジェクト (のサブクラス) のインスタンスを作成する必要があります。
このオブジェクトがであり、マクロMyQObjectを使用して次のプロパティを宣言しているとします: , , , ...Q_PROPERTYMyQObject1* p1MyQObject2* p2MyQObject3* p3
私はそれを行うためにこの機能を持っているとしましょう:
QObject* Manager::createInstanceOf(const QMetaObject* c, QList<const char*> paramsNames, QList<QObject*> oparams) {
QObject* instance = (QObject*) c->newInstance();
for(int i = 0; i < paramsNames.length(); i++) {
QVariant variant = QVariant::fromValue(oparams[i]);
instance->setProperty(paramsNames[i], variant);
}
return instance;
}
どこ:
cは にQMetaObject*関連付けられていMyQObjectます。
paramsNamesマクロQList<const char*>を介してオブジェクトのクラス定義で宣言されたプロパティの名前を含むです。Q_PROPERTYこの例では、 、、、 ...QListが含まれています。"MyQObject1""MyQObject2""MyQObject3"
oparamsQList<QObject*>すでにインスタンス化されているオブジェクトのプロパティを含む です。それらのどれもQObjectそれ自体ではなく、 のサブクラスでありQObject、すべてが同じではない可能性があります。この例では、 、、...QListのインスタンスを含むです。MyQObject1MyQObject2MyQObject3
私の問題は、 のインスタンスが作成され、マクロ およびMyQObjectを使用して型が登録されたにもかかわらず、 segfault を取得せずに に関連付けられているプロパティのメソッドにアクセスできないことです。一言で言えば、私はできません:Q_DECLARE_METATYPEqRegisterMetaTypeQObject
myQObjectInstance->property("p1").value<MyQObject1*>()->metaObject();
からではないプロパティの他のメソッドに問題なくアクセスできますQObject。例えば:
myQObjectInstance->property("p1").value<MyQObject1*>()->toString();
setPropertyを実行する前にプロパティをキャストすると、問題を部分的に解決できることに気付きました。
QVariant::fromValue((MyQObject1*) oparams[0]);
プロパティが作成されたときに特定のサブクラスとして設定されていないがQObject、そのスーパークラスとしてキャストされoparams QListている場合(挿入すると自動的にキャストされる)、問題の原因と思われます。
プロパティのタイプが異なるため ( MyQObject1、MyQObject2、MyQObject3...)、コンパイル時にこの情報がわからないため、1 つずつキャストすることはできません。
それで、何かアイデアはありますか?
私は本当にあなたの助けに感謝します. ありがとう。