繁体   English   中英

使用QList <QObject *>作为模型的QML ListView

[英]QML ListView using QList<QObject*> as a model

Qt的文档在这个问题上似乎有点简短,但我正在尝试使用QLists作为ListView的模型。 问题是,我代表一个层次结构,每当点击一个项目时,模型就会与另一个项目交换,QML从C ++回调中获取。

这是表示列表项的对象:

class MyObject : public QObject
{
  Q_OBJECT
  Q_PROPERTY(QString         name     READ getName WRITE setName)
  Q_PROPERTY(QString         subtitle READ getSubtitle)
  Q_PROPERTY(QList<QObject*> descent  READ getChildren NOTIFY childrenUpdated)
  ...
}

以及我如何在QML中使用它:

ListView {
  id: list_view
  model: myModel
  anchors.fill: parent
  delegate: Item {
    id: row
    height: 50
    anchors.left: parent.left
    anchors.right: parent.right

    MouseArea {
      anchors.fill: row
      onClicked: {
        list_view.model = descent;
      }
    }

    Column {
      Text { text: name }
      Text { text: subtitle }
    }
  }
}

“myModel”模型在main中设置,如下所示:

context->setContextProperty("myModel", QVariant::fromValue(folder.getChildren()));

第一次出现ListView时,它使用myModel作为模型,它可以工作。 但是,每当我点击某个项目时,ListView会创建预期的确切项目数...但它无法读取任何属性!

为什么ListView确切地知道需要创建多少项目,却看不到它们的属性?

我相信这是你正在观察的正确行为。 QML知道QList的元素数量,但是只要查询它们的namesubtitle是不可能的,因为descent不符合ListView::model的约束

ListView :: model属性的QML文档中:

该模型提供用于在视图中创建项目的数据集。 可以使用ListModel,XmlListModel或VisualItemModel直接在QML中创建模型,或者由C ++模型类提供模型。 如果使用C ++模型类,则它必须是QAbstractItemModel的子类或简单列表。

所以在这方面,你要么必须改变descent是一个简单的列表,我相信它意味着包含简单数据,如单个QStringint等...或者将它实现为包含QObjects列表的QAbstractItemModel

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM