diff --git a/src/quick/items/qquickvisualadaptormodel.cpp b/src/quick/items/qquickvisualadaptormodel.cpp index b15513eed2dd2955b23cb1e365a91dce878cbf53..bc8c75933a7f9c95f4c7ddbfb45ec0268050db5d 100644 --- a/src/quick/items/qquickvisualadaptormodel.cpp +++ b/src/quick/items/qquickvisualadaptormodel.cpp @@ -457,15 +457,15 @@ public: const_cast<VDMAbstractItemModelDataType *>(this)->release(); } - QString stringValue(const QQuickVisualAdaptorModel &model, int index, const QString &role) const + QVariant value(const QQuickVisualAdaptorModel &model, int index, const QString &role) const { QHash<QByteArray, int>::const_iterator it = roleNames.find(role.toUtf8()); if (it != roleNames.end()) { - return model.aim()->index(index, 0, model.rootIndex).data(*it).toString(); + return model.aim()->index(index, 0, model.rootIndex).data(*it); } else if (role == QLatin1String("hasModelChildren")) { - return QVariant(model.aim()->hasChildren(model.aim()->index(index, 0, model.rootIndex))).toString(); + return QVariant(model.aim()->hasChildren(model.aim()->index(index, 0, model.rootIndex))); } else { - return QString(); + return QVariant(); } } @@ -596,12 +596,12 @@ public: const_cast<VDMListModelInterfaceDataType *>(this)->release(); } - QString stringValue(const QQuickVisualAdaptorModel &model, int index, const QString &role) const + QVariant value(const QQuickVisualAdaptorModel &model, int index, const QString &role) const { QHash<QByteArray, int>::const_iterator it = roleNames.find(role.toUtf8()); return it != roleNames.end() && model - ? model.lmi()->data(index, *it).toString() - : QString(); + ? model.lmi()->data(index, *it) + : QVariant(); } QQuickVisualDataModelItem *createItem( @@ -735,11 +735,11 @@ public: return model.list.count(); } - QString stringValue(const QQuickVisualAdaptorModel &model, int index, const QString &role) const + QVariant value(const QQuickVisualAdaptorModel &model, int index, const QString &role) const { return role == QLatin1String("modelData") - ? model.list.at(index).toString() - : QString(); + ? model.list.at(index) + : QVariant(); } QQuickVisualDataModelItem *createItem( @@ -819,11 +819,11 @@ public: return model.list.count(); } - QString stringValue(const QQuickVisualAdaptorModel &model, int index, const QString &role) const + QVariant value(const QQuickVisualAdaptorModel &model, int index, const QString &role) const { if (QObject *object = model.list.at(index).value<QObject *>()) - return object->property(role.toUtf8()).toString(); - return QString(); + return object->property(role.toUtf8()); + return QVariant(); } QQuickVisualDataModelItem *createItem( diff --git a/src/quick/items/qquickvisualadaptormodel_p.h b/src/quick/items/qquickvisualadaptormodel_p.h index dba65e197e471df3aeb8fa10a5b105d97f7a2207..5176921a51591aecf8f8420b159b8e6d0a4dfe22 100644 --- a/src/quick/items/qquickvisualadaptormodel_p.h +++ b/src/quick/items/qquickvisualadaptormodel_p.h @@ -69,8 +69,8 @@ public: virtual int count(const QQuickVisualAdaptorModel &) const { return 0; } virtual void cleanup(QQuickVisualAdaptorModel &, QQuickVisualDataModel * = 0) const {} - virtual QString stringValue(const QQuickVisualAdaptorModel &, int, const QString &) const { - return QString(); } + virtual QVariant value(const QQuickVisualAdaptorModel &, int, const QString &) const { + return QVariant(); } virtual QQuickVisualDataModelItem *createItem( QQuickVisualAdaptorModel &, @@ -113,8 +113,8 @@ public: inline const QListModelInterface *lmi() const { return static_cast<const QListModelInterface *>(object()); } inline int count() const { return qMax(0, accessors->count(*this)); } - inline QString stringValue(int index, const QString &role) const { - return accessors->stringValue(*this, index, role); } + inline QVariant value(int index, const QString &role) const { + return accessors->value(*this, index, role); } inline QQuickVisualDataModelItem *createItem(QQuickVisualDataModelItemMetaType *metaType, QQmlEngine *engine, int index) { return accessors->createItem(*this, metaType, engine, index); } inline bool hasProxyObject() const { diff --git a/src/quick/items/qquickvisualdatamodel.cpp b/src/quick/items/qquickvisualdatamodel.cpp index ddd8e16ecff46d7bd80881a20019f1215c1ad960..e72139129673206ca45a33823992174104c7c698 100644 --- a/src/quick/items/qquickvisualdatamodel.cpp +++ b/src/quick/items/qquickvisualdatamodel.cpp @@ -955,7 +955,20 @@ QString QQuickVisualDataModelPrivate::stringValue(Compositor::Group group, int i { Compositor::iterator it = m_compositor.find(group, index); if (QQuickVisualAdaptorModel *model = it.list<QQuickVisualAdaptorModel>()) { - return model->stringValue(it.modelIndex(), name); + QString role = name; + int dot = name.indexOf(QLatin1Char('.')); + if (dot > 0) + role = name.left(dot); + QVariant value = model->value(it.modelIndex(), role); + while (dot > 0) { + QObject *obj = qvariant_cast<QObject*>(value); + if (!obj) + return QString(); + int from = dot+1; + dot = name.indexOf(QLatin1Char('.'), from); + value = obj->property(name.mid(from, dot-from).toUtf8()); + } + return value.toString(); } return QString(); } diff --git a/tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml b/tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml index 99151aa9e1e84b89c387850dc8a3228b48e7afb5..b0d5bd8032329a8772914485ca673bc74971ec6e 100644 --- a/tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml +++ b/tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml @@ -14,6 +14,10 @@ ListView { Text { objectName: "section"; text: parent.ListView.section } } } + + function changeSectionProperty() { + section.property = "object.subName" + } section.property: "name" section.criteria: ViewSection.FullString } diff --git a/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp b/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp index 5da7dc7fbac5048340e5d0ce4b8f589cc07871ff..4684df2caed7f92c6a373a7a9e23ae2bb769d1b8 100644 --- a/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp +++ b/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp @@ -151,17 +151,42 @@ public: }; #endif +class DataSubObject : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString subName READ subName WRITE setSubName NOTIFY subNameChanged) + +public: + DataSubObject(QObject *parent=0) : QObject(parent) {} + + QString subName() const { return m_subName; } + void setSubName(const QString &name) { + if (name != m_subName) { + m_subName = name; + emit subNameChanged(); + } + } + +signals: + void subNameChanged(); + +private: + QString m_subName; +}; + class DataObject : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged) + Q_PROPERTY(QObject *object READ object) public: DataObject(QObject *parent=0) : QObject(parent) {} DataObject(const QString &name, const QString &color, QObject *parent=0) - : QObject(parent), m_name(name), m_color(color) { } + : QObject(parent), m_name(name), m_color(color), m_object(new DataSubObject(this)) { } QString name() const { return m_name; } @@ -180,6 +205,11 @@ public: } } + QObject *object() const { return m_object; } + void setSubName(const QString &sn) { + m_object->setSubName(sn); + } + signals: void nameChanged(); void colorChanged(); @@ -187,6 +217,7 @@ signals: private: QString m_name; QString m_color; + DataSubObject *m_object; }; class ItemRequester : public QObject @@ -533,6 +564,14 @@ void tst_qquickvisualdatamodel::objectListModel() dataList[0]->setProperty("name", QLatin1String("Changed")); QCOMPARE(name->text(), QString("Changed")); QCOMPARE(name->property("modelName").toString(), QString("Changed")); + + // Test resolving nested section property + DataObject *obj = static_cast<DataObject*>(dataList[0]); + obj->setSubName("SubItem 1"); + + QMetaObject::invokeMethod(listview, "changeSectionProperty"); + section = findItem<QQuickText>(contentItem, "section", 0); + QCOMPARE(section->text(), QString("SubItem 1")); } void tst_qquickvisualdatamodel::singleRole()