QML Qt 5.5如何正确显示Treeview
How to display correctly Treeview with QML Qt 5.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"})
}
}
我想要这样的东西:
我该怎么做?
您的模型没有任何 parent child 关系,这就是它显示为列表的原因。
您会希望 "TreeModel" 成为 TreeItems 的集合。每个 TreeItem 都有自己的 children 和 parent 项的知识。
您可以按照此处 http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html 找到的完全实现的 Qt 示例进行操作。您需要(在 C++ 中)为 TreeItem 创建一个 class,并为您的 TreeModel 创建一个单独的 class。
该示例是工作代码,您只需复制并粘贴它即可为您的 TreeView 获取工作模型。
您将特别感兴趣的部分是方法 setupModelData()
的实现。这就是您要解析 80 年代歌词的精彩数据集并为每个歌词分配一个 TreeItem 的地方。
每个 TreeItem(每行数据一个)应该在创建时(在其构造函数中)被赋予其 parent 知识。然后,一旦创建了 children,就调用 parentTreeItem.appendChild(childTreeItem)
当你的模型完成后,你可以通过几种方式将它分配给你的 qml 视图,我更喜欢用 qmlRegisterType 注册它 (http://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterType)
一旦注册,它就可以在 qml 中创建,就好像它是一个 ListView 或任何其他 qml object。
注意:您将拥有这个 rootItem。这是视图无法使用的东西,但是您所有的 "first indentation" parent 都是 rootItem 的 children。
祝你好运!
您能否提供导致您未能为 QAbstractItemModel 创建快捷方式的代码片段?
您还可以创建一个扩展 QStandardItemModel
并覆盖 roleNames()
的 TreeModel class,就像完成 here 一样。要将 children 添加到树中的节点,只需使用 appendRow()
.
TreeModel::TreeModel(QObject *parent) : QStandardItemModel(parent)
{
QStandardItem *root = new QStandardItem("root");
QStandardItem *child = new QStandardItem("child");
this->appendRow(root);
root->appendRow(child);
}
我正在尝试使用 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"})
}
}
我想要这样的东西:
我该怎么做?
您的模型没有任何 parent child 关系,这就是它显示为列表的原因。
您会希望 "TreeModel" 成为 TreeItems 的集合。每个 TreeItem 都有自己的 children 和 parent 项的知识。
您可以按照此处 http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html 找到的完全实现的 Qt 示例进行操作。您需要(在 C++ 中)为 TreeItem 创建一个 class,并为您的 TreeModel 创建一个单独的 class。
该示例是工作代码,您只需复制并粘贴它即可为您的 TreeView 获取工作模型。
您将特别感兴趣的部分是方法 setupModelData()
的实现。这就是您要解析 80 年代歌词的精彩数据集并为每个歌词分配一个 TreeItem 的地方。
每个 TreeItem(每行数据一个)应该在创建时(在其构造函数中)被赋予其 parent 知识。然后,一旦创建了 children,就调用 parentTreeItem.appendChild(childTreeItem)
当你的模型完成后,你可以通过几种方式将它分配给你的 qml 视图,我更喜欢用 qmlRegisterType 注册它 (http://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterType)
一旦注册,它就可以在 qml 中创建,就好像它是一个 ListView 或任何其他 qml object。
注意:您将拥有这个 rootItem。这是视图无法使用的东西,但是您所有的 "first indentation" parent 都是 rootItem 的 children。
祝你好运!
您能否提供导致您未能为 QAbstractItemModel 创建快捷方式的代码片段?
您还可以创建一个扩展 QStandardItemModel
并覆盖 roleNames()
的 TreeModel class,就像完成 here 一样。要将 children 添加到树中的节点,只需使用 appendRow()
.
TreeModel::TreeModel(QObject *parent) : QStandardItemModel(parent)
{
QStandardItem *root = new QStandardItem("root");
QStandardItem *child = new QStandardItem("child");
this->appendRow(root);
root->appendRow(child);
}