QML - 访问存储在 QList 中的 QObject 类属性
Posted
技术标签:
【中文标题】QML - 访问存储在 QList 中的 QObject 类属性【英文标题】:QML - Accessing QObject class properties which is stored in QList 【发布时间】:2017-08-19 08:53:59 【问题描述】:我在访问 QML 中的属性时遇到问题。
QList 是一个属性,我可以访问它,但是当我尝试在 QML 中访问 classB 的属性时,我收到类型错误/未定义。以下是代码:
[EDIT 1] - 根据建议将 QList 更改为 QVariantList:
//ClassA.h
#include <QObject>
#include "classb.h"
Q_DECLARE_METATYPE(QList<ClassB*>)
class ClassA : public QObject
Q_OBJECT
Q_PROPERTY(QVariantList objList READ getClassBDetails) //[EDIT 1]
public:
explicit ClassA(QObject *parent = nullptr);
QVariantList getClassBDetails(); //[EDIT 1]
private:
QVariantList m_list; //[EDIT 1]
ClassB m_Bobj;
;
//ClassA.cpp
#include "classa.h"
ClassA::ClassA(QObject *parent) : QObject(parent)
m_list.append(QVariant::fromValue(&m_Bobj)); //** Appending to QvariantList
QVariantList ClassA ::getClassBDetails() //[EDIT 1]
return m_list;
//ClassB.h
#include <QObject>
class ClassB : public QObject
Q_OBJECT
Q_PROPERTY(int val READ getval WRITE setval NOTIFY valChanged)
public:
explicit ClassB(QObject *parent = nullptr);
int m_val = 10;
int getval();
void setval(int val);
signals:
void valChanged();
public slots:
;
//ClassB.cpp
#include "classb.h"
ClassB::ClassB(QObject *parent) : QObject(parent)
int ClassB::getval()
return m_val;
void ClassB::setval(int val)
m_val = val;
emit valChanged();
//Main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "classa.h"
int main(int argc, char *argv[])
QGuiApplication app(argc, argv);
ClassA aObj;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("classAObj",&aObj);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
//Main.qml
import QtQuick 2.6
import QtQuick.Window 2.2
Window
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Component.onCompleted:
console.log("value========",classAObj.objList[0].val) //** Same error
如果我尝试访问 "classAObj.objList[0].val"
,则会收到 TypeError: Cannot read property 'val' of undefined
错误。我在这里做错了什么?
【问题讨论】:
【参考方案1】:您做错了什么是期望 []
操作员能够工作。不会的。
有一种方法可以让它工作,如果你将 QList
转换为 QVariantList
,QML 将自动转换为 JS 数组。
但我实际上推荐的是简单地使用附属函数,实现一个get(index)
,如果需要,一个set(index)
函数,你就设置好了。
您也可以看看这个generic object list model,它非常灵活、强大且有用,支持任何QObject
子级,包括在QML 中定义的对象、声明性和嵌套定义,最后但同样重要的是,它可以直接作为模型使用。
【讨论】:
我实际上尝试过使用 QVariantList,但我无法在其中插入ClassB
对象。您能举个例子吗?
我不确定这种隐式转换的列表有多“可编辑”。我建议你不要为此烦恼。如果你想从 C++ 插入,你显然会插入一个 QVariant::fromValue(objPtr)
,因为它只是一个 QList<QVariant>
,你插入的方式与插入任何 QList
的方式相同。
谢谢,我现在可以通过了。之后我可以使用[ ]
运算符访问吗?因为我确实喜欢这个var res = classAObj.objDetails
,后来我尝试打印出类似res[0]
的东西......并得到同样的错误..
你改成QVariantList
了吗?它应该工作。您可能需要从 Q_INVOKABLE
函数返回而不是使用属性。正如我已经推荐的那样 - 不要为此烦恼。不完全确定你为什么坚持让你的生活更艰难。
是的,我在 Q_PROPERTY
声明中进行了更改,并将函数 getClassBDetails
的类型返回给 QVariantList,但它不起作用。我还将getClassBDetails
更改为Q_INVOKABLE
并直接从QML 调用,即使这不起作用。我不知道为什么它不起作用。以上是关于QML - 访问存储在 QList 中的 QObject 类属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在 QML 中访问基于 QObjectList 的模型中的某些元素