(QObjectから継承された)カスタムオブジェクトの配列であるパラメーターを含むQt C++クラスから信号を発信し、そのqmlスロットでパラメーターを受け取りたいのですが、qmlコードでは使用できません。たとえば、クラスがあるとしましょう
class TestType : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name)
Q_PROPERTY(qint32 id READ id)
public:
explicit TestType(QObject *parent = 0) : QObject(parent) {}
qint32 id() const { return m_id; }
void setId(qint32 id) { m_id = id; }
QString name() const { return m_name; }
void setName(QString name) { m_name = name; }
private:
qint32 m_id;
QString m_name;
};
タイプは次のように登録されます。
qmlRegisterType<TestType>(uri, 0, 1, "TestType");
そして、私はこのような信号を出すクラスを持っています
Q_SIGNALS:
void mySignal(QList<TestType *> array);
複数の要素が入力された配列で信号を送信する場合、qmlスロットで読み取ろうとすると、次のようになります。
onMySignal: {
console.log("element:" + array[0]);
}
"ndefined"がarray [0]として表示され、配列要素が持つすべてのクラスメンバーが表示されます。スタンドアロンのTestTypeオブジェクトを信号パラメーターとして送信するテストを行ったところ、qmlスロットに問題なく到達しましたが、それらの配列を送信することはできません。
同じ結果でQList、QmlListProperty、またはQVariantListを使用しようとしました。 QObject要素から継承されたカスタムタイプの配列を信号パラメーターとして送信する方法はありますか?
私はそれを持っている! この記事 は完全にそれを行う方法を説明します
解決策は、qVariantFromValueメソッドを使用して、QVariantListにTestTypeを挿入することです。次に、信号はQVariantListをリストであるすべてのパラメーターのタイプとして使用します
TestType *tt = new TestType(this);
QVariantList list;
list.append(qVariantFromValue((TestType*)tt));
Q_EMIT mySignal(list);
シグナルは次のように宣言されています。
Q_SIGNALS:
void mySignal(QVariantList list);
次に、qmlから完全に読み取ることができます。
onMySignal: {
console.log("name of first TestType in list: " + list[0].name;
}