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

时间:2015-10-09 14:55:00

标签: qt treeview qml qt5.5

我正在尝试使用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

我该怎么做?

2 个答案:

答案 0 :(得分:4)

您还可以创建一个扩展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);
}

答案 1 :(得分:3)

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

你想要你的" 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的孩子。

祝你好运!

您能否提供一条代码片段,说明导致您未能为QAbstractItemModel创建快捷方式的行?