• 关于TreeView的简单使用(Qt6.4.1)


    前言

    TreeView是在Qt6.3中加入的,弥补了Qt中无官方树图。笔者上手尝试了下,虽然有点麻烦,但官方也做了不少简化。

    本次教程,笔者创建一个简单的示例,以帮助读者使用TreeView。

    一、创建模型类

    当前模型需要使用C++定义,模型类继承自QAbstractItemModel,笔者的头文件如下

    1. class TreeItem;
    2. class TreeModel : public QAbstractItemModel
    3. {
    4. Q_OBJECT
    5. public:
    6. enum TreeRole {
    7. FullNameRole = Qt::DisplayRole,
    8. AddressRole = Qt::UserRole
    9. };
    10. Q_ENUM(TreeRole)
    11. explicit TreeModel(QObject *parent = nullptr);
    12. ~TreeModel();
    13. // Header:
    14. QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
    15. // bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;
    16. // Basic functionality:
    17. QModelIndex index(int row, int column,
    18. const QModelIndex &parent = QModelIndex()) const override;
    19. QModelIndex parent(const QModelIndex &index) const override;
    20. int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    21. int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    22. QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    23. QHash<int, QByteArray> roleNames() const override;
    24. // Editable:
    25. bool setData(const QModelIndex &index, const QVariant &value,
    26. int role = Qt::EditRole) override;
    27. Qt::ItemFlags flags(const QModelIndex& index) const override;
    28. private:
    29. void setupModelData(TreeItem *parent);
    30. TreeItem *getItem(const QModelIndex &index) const;
    31. TreeItem *rootItem;
    32. };

    TableView的模型相关,多了index()和parent()的实现

    模型类实现后,可以注册到qml中

    qmlRegisterType("TreeModelTest", 1, 0, "TreeModel");

    二、显示模型数据

    1. TreeView {
    2. id: treeView
    3. //模型
    4. model: TreeModel {}
    5. //委托
    6. delegate: TreeViewDelegate {}
    7. //边界操作
    8. boundsBehavior: Flickable.StopAtBounds
    9. //水平滚动条
    10. ScrollBar.horizontal: ScrollBar {}
    11. //垂直滚动条
    12. ScrollBar.vertical: ScrollBar {}
    13. }

     树形视图的实现比较好理解,可以调整很多属性

    TreeViewDelegate是Qt内置的委托,也可以自定义实现

    注:

    TreeView继承自TableView,所以TableView可以使用的东西,TreeView也可以使用。

    三、添加水平表头

    1. HorizontalHeaderView {
    2. id: tableView_topHeader
    3. anchors.left: treeView.left
    4. anchors.right: treeView.right
    5. anchors.top: parent.top
    6. syncView: treeView
    7. }

     若不指定水平表头的模型数据,默认会调用模型的headerData()函数获取,需要在C++中实现。

    syncView属性可以将treeView的水平位置或列宽等信息,同步到水平表头,这样就不要再单独调用相关属性了。

    注:

    HorizontalHeaderView继承自TableView,所以TableView可以使用的东西,HorizontalHeaderView也可以使用。

    四、添加垂直表头

    1. VerticalHeaderView {
    2. id: tableView_leftHeader
    3. anchors.left: parent.left
    4. anchors.top: treeView.top
    5. anchors.bottom: treeView.bottom
    6. syncView: treeView
    7. model: treeView.rows
    8. }

    若不指定水平表头的模型数据,默认会调用模型的headerData()函数获取,但要注意,headerData()只能返回最顶层的表头数据,导致显示异常。笔者建议直接绑定TreeView的行数或自定义。

    syncView属性可以将treeView的垂直位置或列高等信息,同步到垂直表头,这样就不要再单独调用相关属性了。

    注:

    VerticalHeaderView继承自TableView,所以TableView可以使用的东西,VerticalHeaderView也可以使用。

    五、增加选择功能

    1. TreeView {
    2. id: treeView
    3. //模型
    4. model: TreeModel {}
    5. //选择模型
    6. selectionModel: ItemSelectionModel{ id: itemSelectionModel}
    7. //委托
    8. delegate: TreeViewDelegate {}
    9. //边界操作
    10. boundsBehavior: Flickable.StopAtBounds
    11. //水平滚动条
    12. ScrollBar.horizontal: ScrollBar {}
    13. //垂直滚动条
    14. ScrollBar.vertical: ScrollBar {}
    15. }

    笔者测试了下Qt自带的选择模型,win10下效果还不错,但在android下的效果欠佳

      

    六、读取模型数据

    1. treeView.delegate: TreeViewDelegate {
    2. TapHandler {
    3. acceptedButtons: Qt.RightButton
    4. onTapped: {
    5. console.debug("currentIndex",row,column,index,
    6. treeView.modelIndex(column, row),
    7. model.display )
    8. }
    9. }
    10. }

     TreeView读取模型数据,和一般视图相同,但也有一些区别。和其他视图-模型不同,TreeView的row、column是视图中的显示的行与列(从0开始),index是视图中的列向叠加序列(自上而下,先计算第0列,再依次叠加后面几列)。模型中的行是相对于父对象的。也就是说,视图的row、column、index与模型中的不同,但存在对应关系。可以TreeView里的函数获取,如 columnAtIndex()、 modelIndex()、 rowAtIndex()等。

    笔者使用的测试源码

    后记

    TreeView可以自定义表头,以实现复杂的表头设计。

    时间所限,笔者只是显示了TreeView的简单用法,且仅在win10和android下简单测试。其中定有不足,请小伙伴指正。

  • 相关阅读:
    win c++使用lua环境配置 5.3.5版本
    使用Redis实现文章阅读量、收藏、点赞数量记录功能
    企业如何搭建智能客服系统?
    11-注意力机制
    Ruby 里表的增删改查
    opencv 通过滑动条调整阈值处理、边缘检测、轮廓检测、模糊、色调调整和对比度增强参数 并实时预览效果
    Maven 自动化构建
    [Error]Swift开发调试时使用LLDB的po和print命令无法输出变量
    springboot+学生信息管理 毕业设计-附源码191219
    【矩阵】- “之”字形打印
  • 原文地址:https://blog.csdn.net/aggs1990/article/details/128103525