c++ - QML ListView 使用 QList<QObject*> 作为模型

标签 c++ qt qml

Qt 的文档在这个问题上似乎有点短,但我正在尝试使用 QList 作为 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 property 的 QML 文档:

The model provides the set of data that is used to create the items in the view. Models can be created directly in QML using ListModel, XmlListModel or VisualItemModel, or provided by C++ model classes. If a C++ model class is used, it must be a subclass of QAbstractItemModel or a simple list.

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

关于c++ - QML ListView 使用 QList<QObject*> 作为模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21687629/

相关文章:

c++ - 当焦点在 QTableView 上丢失时丢失背景颜色

c++ - 在其他重载中重用重载

c++ - 如何在另一个类中使用主类中的全局 const int 变量

python - 编辑 QTableView 单元格值

c - 此函数声明的预期符号问题

qt - 构建/部署项目测试时出错(套件 : Desktop Qt 5. 7.1 MSVC2015_64bit)执行步骤 "qmake"时

c++ - 辅助线程中的QTimer

qt - 获取当前显示的委托(delegate)的索引 - QML ListView

javascript - 由 Javascript 填充的 QML ListView

c++ - 检查应用程序是否首次运行