如何使用QML Qt 5.5正确显示Treeview

6
我想创建一个正确的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"})
        }
    }

enter image description here

我想要像这样的东西:

enter image description here

如何做到这一点?

http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts/93989#93989 - Mitch
示例实现在此处:http://www.codeproject.com/Articles/632795/QML-TreeModel-and-TreeView - ramtheconqueror
@ramtheconqueror,那不是我想要的,我已经有了QT 5.4的Treeview实现,但现在我想使用Qt 5.5的QML Treeview。 http://doc.qt.io/qt-5/qml-qtquick-controls-treeview.html - kavaliero
3
作为“TreeView”的模型,您需要提供对“QAbstractItemModel”的实现。 - folibis
2
尽管有点过时,但在这里您可以找到一个很好的例子,以便了解您需要做什么的基本思路:https://www.qtdeveloperdays.com/sites/default/files/north-america/QtQuickTreeView.pdf - skypjack
显示剩余4条评论
2个回答

5

您还可以创建一个继承QStandardItemModel并重写roleNames()的TreeModel类,就像这里所做的那样。要向树中的节点添加子项,只需使用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不会更新或刷新。 - Francisco Hernandez

4

你的模型没有父子关系,因此它被显示为列表。

你需要让“TreeModel”成为一组TreeItems。每个TreeItem将了解它们自己的子项和父项。

你可以在这里找到完整实现的Qt示例 http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html。你需要(用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的子元素。

祝你好运!

你能提供一段代码片段,说明哪一行导致了你无法为QAbstractItemModel创建快捷方式?


2
任何阅读此文的人都应该注意,链接的TreeModel类与QML TreeView不是“工作代码”。链接的代码适用于行为与TreeView不同的QTreeView。这个链接可能会有所帮助(https://forum.qt.io/topic/56099/solved-new-treeview-does-not-connect-to-c-model)。 - Joshua Kolden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接