QML ListView使用QList <qobject *>作为模型</qobject *>

时间:2014-02-10 20:51:17

标签: c++ qt qml

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 个答案:

答案 0 :(得分:5)

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

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

  

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

因此,在这方面,您必须将descent更改为一个简单的列表,我认为这意味着包含简单数据,例如单个QStringint等。 ..或将其实现为QAbstractItemModel,其中包含您的QObjects

列表