我想从 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;
}