C++ 公开QList<;QObject*>;QML的层次结构
我目前的情况是,我有一个带有MyClass的QList,还包括一个列表QList 要显示此列表层次结构,我希望在ListView中提供一个中继器 我用QStringList试过了,效果很好(见下面未注释的行)。当我尝试使用QList执行此操作时,我无法访问MySubClass的name属性。而是显示MyClass的name属性 错误输出:C++ 公开QList<;QObject*>;QML的层次结构,c++,qml,qobject,qlist,C++,Qml,Qobject,Qlist,我目前的情况是,我有一个带有MyClass的QList,还包括一个列表QList 要显示此列表层次结构,我希望在ListView中提供一个中继器 我用QStringList试过了,效果很好(见下面未注释的行)。当我尝试使用QList执行此操作时,我无法访问MySubClass的name属性。而是显示MyClass的name属性 错误输出: Object 1 Object 1 Object 1 Object 2 正确的输出应为: Object 1 SubObject 1 SubObject 2
Object 1
Object 1
Object 1
Object 2
正确的输出应为:
Object 1
SubObject 1
SubObject 2
Object 2
编辑:2014年12月8日
我发现了为什么子列表不起作用。我只需要替换子ListView委托中的一行(name->modelData.name)
这是我的密码:
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QList>
#include <QDebug>
#include "myclass.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
/* create simple stringlist */
QStringList dataList;
dataList << "Data 1"
<< "Data 2"
<< "Data 3";
/* create more complex QObject List */
MySubClass *mySubObject = NULL;
QList<QObject *> mySubList;
mySubObject = new MySubClass;
mySubObject->setName("SubObject 1");
mySubList.append(mySubObject);
mySubObject = new MySubClass;
mySubObject->setName("SubObject 2");
mySubList.append(mySubObject);
/* create object list */
MyClass *myObject = NULL;
QList<QObject *> myList;
myObject = new MyClass;
myObject->setName("Object 1");
myObject->setDataList(dataList);
myObject->setObjectList(mySubList);
myList.append(myObject);
myObject = new MyClass;
myObject->setName("Object 2");
myObject->setDataList(dataList);
myList.append(myObject);
qDebug () << myList.size();
myObject = NULL;
/* start engine and expose object list */
QQmlApplicationEngine engine;
QQmlContext *myContext = engine.rootContext();
myContext->setContextProperty("myObjectList", QVariant::fromValue(myList));
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}
为了向QObject派生类型的QML列表公开,应该使用而不是
QList
作为属性类型
MyClass.h:
Q_PROPERTY (QQmlListProperty<MySubClass> objectList READ getMySubClassList NOTIFY objectListChanged)
public:
QQmlListProperty<MySubClass> getMySubClassList() {
return QQmlListProperty<MySubClass>(this, 0, &MyClass::countMySubClassList, &MyClass::atMySubClassList);
}
static int countMySubClassList(QQmlListProperty<MySubClass> *property) {
MyClass *m = qobject_cast<MyClass *>(property->object);
return m->m_objectList.size();
}
static MySubClass *atMySubClassList(QQmlListProperty<MySubClass> *property, int index) {
MyClass *m = qobject_cast<MyClass *>(property->object);
return m->m_objectList[index];
}
private:
QList<MySubClass *> m_objectList
尝试在类定义之后添加
Q\u DECLARE\u元类型(MySubClass*)
,在我的例子中,QList工作正常,啊,我将QObjectList作为属性传递谢谢,我实现了qqmlistproperty,它似乎工作正常。-这是我第一次使用QList而不是QAbstractListModel,对我来说,QQmlListProperty似乎比QAbstractListModel强大得多。你能解释一下吗?@Quperman作为模型,qabstractemodel是更强大、更简单、更灵活的解决方案。如果希望公开简单的短常量列表,可以使用QQmlListProperty作为模型。在另一种情况下,最好采用Qabstractemodel。
#ifndef MYSUBCLASS_H
#define MYSUBCLASS_H
#include <QObject>
#include <QString>
class MySubClass : public QObject
{
Q_OBJECT
Q_PROPERTY (QString name READ name WRITE setName NOTIFY nameChanged)
public:
inline MySubClass(QObject *parent = 0) : QObject(parent) {}
inline ~MySubClass() {}
QString name() const
{
return m_name;
}
public slots:
void setName(QString arg)
{
if (m_name != arg) {
m_name = arg;
emit nameChanged(arg);
}
}
signals:
void nameChanged(QString arg);
private:
QString m_name;
};
#endif // MYSUBCLASS_H
import QtQuick 2.2
import QtQuick.Window 2.1
Window {
visible: true
width: 360
height: 360
ListView {
id: view
anchors.fill: parent
model: myObjectList
delegate: Item {
width: parent.width
height: col.height
Column {
id: col
Text {
id: nameLabel
text: name
}
Repeater {
id: dataView
// model: dataList
model: objectList
delegate: Text {
id: dataLabel
// text: modelData
// text: name
/* Here's the fix!!! (dunno why, but it works) */
text: modelData.name
}
}
}
}
}
}
Q_PROPERTY (QQmlListProperty<MySubClass> objectList READ getMySubClassList NOTIFY objectListChanged)
public:
QQmlListProperty<MySubClass> getMySubClassList() {
return QQmlListProperty<MySubClass>(this, 0, &MyClass::countMySubClassList, &MyClass::atMySubClassList);
}
static int countMySubClassList(QQmlListProperty<MySubClass> *property) {
MyClass *m = qobject_cast<MyClass *>(property->object);
return m->m_objectList.size();
}
static MySubClass *atMySubClassList(QQmlListProperty<MySubClass> *property, int index) {
MyClass *m = qobject_cast<MyClass *>(property->object);
return m->m_objectList[index];
}
private:
QList<MySubClass *> m_objectList
qmlRegisterUncreatableType<MySubClass,1>("project.mySubClass",1,0,"mySubClass","error message");