web-dev-qa-db-ja.com

c ++からカスタムタイプオブジェクトの配列パラメーターを使用して信号を送信し、qmlで受信する

(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要素から継承されたカスタムタイプの配列を信号パラメーターとして送信する方法はありますか?

1
Roberto Mier

私はそれを持っている! この記事 は完全にそれを行う方法を説明します

解決策は、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;
}
1
Roberto Mier