emite sinal com parâmetro de matriz de objetos de tipo personalizado de c ++ e recebe em qml

1

Eu gostaria de emitir um sinal de uma classe Qt C ++ que inclua um parâmetro que é uma matriz de objetos personalizados (herdados de QObject) e receba o parâmetro em seu slot qml, mas estou com medo de não estar disponível em código qml. Digamos, por exemplo, que eu tenha minha classe

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;
};

O tipo é registrado desta maneira:

qmlRegisterType<TestType>(uri, 0, 1, "TestType");

e eu tenho uma classe onde eu emito um sinal como este

Q_SIGNALS:
    void mySignal(QList<TestType *> array);

se eu emitir o sinal com o array preenchido com vários elementos, se eu tentar ler no slot qml:

onMySignal: {
  console.log("element:" + array[0]);
}

Eu vejo " indefinido " como array [0] e, obviamente, qualquer membro da classe que o elemento da matriz possui. Quando eu fiz testes enviando um objeto TestType autônomo como parâmetro de sinal eu tenho isso no slot qml sem qualquer problema, mas eu não sou capaz de enviar uma matriz deles.

Eu tentei usar QList, QmlListProperty ou QVariantList com o mesmo resultado. Existe alguma maneira de enviar uma matriz de tipo personalizado herdada de elementos QObject como um parâmetro de sinal?

    
por Roberto Mier 19.06.2014 / 10:48

1 resposta

1

Eu entendi! Este artigo explica como fazer isso perfeitamente

A solução é inserir TestType em um QVariantList usando o método qVariantFromValue. Então, o sinal usa QVariantList como o tipo para todos os parâmetros que são listas

TestType *tt = new TestType(this);
QVariantList list;
list.append(qVariantFromValue((TestType*)tt));
Q_EMIT mySignal(list);

o sinal é declarado assim:

Q_SIGNALS:
  void mySignal(QVariantList list);

Então, ele pode ser lido perfeitamente no qml:

onMySignal: {
    console.log("name of first TestType in list: " + list[0].name;
}
    
por Roberto Mier 20.06.2014 / 13:43