QObject
リフレクションを使用して、オブジェクト (のサブクラス) のインスタンスを作成する必要があります。
このオブジェクトがであり、マクロMyQObject
を使用して次のプロパティを宣言しているとします: , , , ...Q_PROPERTY
MyQObject1* p1
MyQObject2* p2
MyQObject3* 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"
oparams
QList<QObject*>
すでにインスタンス化されているオブジェクトのプロパティを含む です。それらのどれもQObject
それ自体ではなく、 のサブクラスでありQObject
、すべてが同じではない可能性があります。この例では、 、、...QList
のインスタンスを含むです。MyQObject1
MyQObject2
MyQObject3
私の問題は、 のインスタンスが作成され、マクロ およびMyQObject
を使用して型が登録されたにもかかわらず、 segfault を取得せずに に関連付けられているプロパティのメソッドにアクセスできないことです。一言で言えば、私はできません:Q_DECLARE_METATYPE
qRegisterMetaType
QObject
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 つずつキャストすることはできません。
それで、何かアイデアはありますか?
私は本当にあなたの助けに感謝します. ありがとう。