首页 文章

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

提问于
浏览
6

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确切地知道需要创建多少项目,却看不到它们的属性?

1 回答

  • 5

    我相信这是你正在观察的正确行为 . QML知道 QList 中的元素数量,但就查询 namesubtitle 而言,这是不可能的,因为 descent 不符合 ListView::model 的约束

    来自ListView::model property的QML文档:

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

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

相关问题