我有一个 QML ProviderItem,它的对象属性返回 QObject 派生对象的列表。
我想将此列表传递给另一个 QML ConsumerItem 作为其函数 ConsumerAll 的属性。问题是我总是得到空的 QQmlListProperty ,所有回调函数设置为 0 且数据指针设置为 0 (我认为这些是默认构造的值)
像这样的事情:
ProviderItem.h
class ProviderItem : public QObject, public QQmlParserStatus
{
Q_OBJECT
public:
Q_PROPERTY(QQmlListProperty<QObject> objects READ objects NOTIFY objectsChanged)
QQmlListProperty<QObject> objects();
static int objects_count(QQmlListProperty<QObject> *);
static QObject* objects_at(QQmlListProperty<QObject> *, int);
private:
QList<QObject*> m_objects;
}
ProviderItem.cpp
QQmlListProperty<QObject> ProviderItemPrivate::objects()
{
return QQmlListProperty<QObject>(this, nullptr,
ProviderItem::objects_count,
ProviderItem::objects_at);
}
QObject* ProviderItem::objects_at(QQmlListProperty<QObject> *prop, int index)
{
ProviderItem* provider = qobject_cast<ProviderItem*>(prop->object)
return provider->m_objects.at(index);
}
int ProviderItem::objects_count(QQmlListProperty<QObject> *prop)
{
ProviderItem* provider = qobject_cast<ProviderItem*>(prop->object)
return provider->m_objects.count();
}
消费者项目.h
class ConsumerItem: public QObject
{
Q_OBJECT
public:
Q_INVOKABLE void consumeAll(QQmlListProperty<QObject> obj);
};
消费者项目.cpp
void ConsumerItem::consumeAll(QQmlListProperty<QObject> obj)
{
qDebug() << obj.count(); // thows exeption as count callback is 0
}
main.qml
Provider {
id: objectProvider
}
Consumer {
id: objectConsumer
}
Connections {
target: objectProvider
onObjectsChanged: {
console.debug(objectProvider.objects) // gives [object Object]
objectConsumer.consumeAll(objectProvider.objects)
var test = objectProvider.objects
console.debug(test) // gives [object Object]
Thermonav.testList(objectProvider.objects)
}
}
显然 ProviderItem 和 ConsumerItem 已注册:
main.cpp
qmlRegisterType<ProviderItem>(uri, major, minor, "Provider");
qmlRegisterType<ConsumerItem>(uri, major, minor, "Consumer");
我也尝试过:
Q_INVOKABLE void consumeAll(QVariantMap obj);
Q_INVOKABLE void consumeAll(QQmlListProperty<QObject> obj);
Q_INVOKABLE void consumeAll(void* p);
Q_INVOKABLE void consumeAll(QVariant p);
但每次我得到默认构造的值。
根据本文 https://doc.qt.io/qt-5/qml-list.html:
与 C++ 集成时,请注意,从 C++ 传递到 QML 的任何 QQmlListProperty 值都会自动转换为列表值,反之亦然。
所以 qml [object Object] 中的输出对我来说看起来是合法的,因为“list”不是 js 数据类型。但它也说 QML 列表应该转换回 QQmlListProperty ,这绝对不适合我(或者我做错了)。
我正在使用 Qt 5.12.0
那么如何将 C++ 中创建的 QQmlListProperty 传递到 QML 列表,然后传递到 C++ 中的 QQmlListProperty 呢?