【问题标题】:How to display correctly Treeview with QML Qt 5.5如何使用 QML Qt 5.5 正确显示 Treeview
【发布时间】:2016-01-07 14:03:51
【问题描述】:

我正在尝试使用 Qml Qt 5.5 创建正确的 Treeview。 我成功地拥有了一个具有全局根的 Treeview。 但无法找到如何为行项添加子项。

目前我得到了类似的东西:

    TreeView {
        id:listTree
        anchors.fill: parent
        anchors.leftMargin: 1
        headerVisible: false
        backgroundVisible: false

        selection: ItemSelectionModel {
            model: myModel
        }
        TableViewColumn {
            role: "name"
        }

        itemDelegate: Item {
            Text {
                anchors.verticalCenter: parent.verticalCenter
                color: styleData.textColor
                elide: styleData.elideMode
                text: styleData.value
            }
        }

        Component.onCompleted: {
            model.append({"name":"Never"})
            model.append({"name":"gonna"})
            model.append({"name":"give"})
            model.append({"name":"you"})
            model.append({"name":"up"})
            model.append({"name":"Never"})
            model.append({"name":"gonna"})
            model.append({"name":"let"})
            model.append({"name":"you"})
            model.append({"name":"dow"})
        }
    }

我想要这样的东西:

我该怎么做?

【问题讨论】:

标签: qt treeview qml qt5.5


【解决方案1】:

您还可以创建扩展 QStandardItemModel 并覆盖 roleNames() 的 TreeModel 类,如完成 here。要将子节点添加到树中的节点,只需使用 appendRow()

TreeModel::TreeModel(QObject *parent) : QStandardItemModel(parent)
{
    QStandardItem *root = new QStandardItem("root");
    QStandardItem *child = new QStandardItem("child");
    this->appendRow(root);
    root->appendRow(child);
}

【讨论】:

  • 有没有办法在运行时刷新 TreeView?我实现了一个类似的例子,它可以工作。但是,QML TreeView 在修改数据时不会更新或刷新。
【解决方案2】:

您的模型没有任何父子关系,这就是它显示为列表的原因。

您会希望您的“TreeModel”是 TreeItems 的集合。每个 TreeItem 都将了解自己的子项和父项。

您可以按照此处http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html 找到的完全实现的Qt 示例进行操作。您需要(在 C++ 中)为 TreeItem 创建一个类,并为您的 TreeModel 创建一个单独的类。

该示例是工作代码,您只需复制并粘贴它即可为您的 TreeView 获取工作模型。

您将特别感兴趣的部分是方法setupModelData() 的实现。这就是您要解析 80 年代歌词的精彩数据集并为每个歌词分配一个 TreeItem 的地方。

每个 TreeItem(每行数据一个)应在创建时(在其构造函数中)被告知其父项。然后,一旦创建了它的孩子,就调用parentTreeItem.appendChild(childTreeItem)

当你的模型完成后,你可以通过几种方式将它分配给你的 qml 视图,我更喜欢用 qmlRegisterType 注册它(http://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterType

一旦注册,它就可以在 qml 中创建,就像它是 ListView 或任何其他 qml 对象一样。

注意:您将拥有这个 rootItem。这是视图无法使用的东西,但是您所有的“第一次缩进”父母都是 rootItem 的孩子。

祝你好运!

您能否提供代码 sn-p 说明导致您未能为 QAbstractItemModel 创建快捷方式的原因?

【讨论】:

  • 任何阅读本文的人都应该注意,链接的 TreeModel 类不是 QML TreeView 的“工作代码”。链接代码适用于 QTreeView,其行为与 TreeView 不同。此链接可能会有所帮助 (forum.qt.io/topic/56099/…)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多