使用 C++ 中的自定义类型对象数组参数发出信号并在 qml 中接收

使用 C++ 中的自定义类型对象数组参数发出信号并在 qml 中接收

我想从 Qt C++ 类发出一个信号,该类包含一个参数,该参数是自定义对象数组(继承自 QObject),并在其 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]);
}

我懂了 ”不明确的“作为数组 [0],显然,数组元素具有的任何类成员。当我进行测试并发送独立的 TestType 对象作为信号参数时,我已将其放入 qml 插槽中而没有任何问题,但我无法发送它们的数组。

我尝试使用 QList、QmlListProperty 或 QVariantList,结果相同。有没有办法将从 QObject 元素继承的自定义类型数组作为信号参数发送?

答案1

我懂了! 本文解释如何完美地做到这一点

解决方案是使用 qVariantFromValue 方法将 TestType 插入 QVariantList。然后,信号使用 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;
}

相关内容