自定义QTreeView

自定义QTreeViewQt之QTreeView(一) (2014-12-2316:51:33)转载▼标签: qt qtreeview qtableview qabstractitemmodel分类: Qt    之前有讲解过QTableView的使用Qt之QTableView,这节讲解一下也较为常用

大家好,又见面了,我是你们的朋友全栈君。

Qt之QTreeView(一)

 
自定义QTreeView
(2014-12-23 16:51:33)

标签: 

qt

 

qtreeview

 

qtableview

 

qabstractitemmodel

分类: Qt
    之前有讲解过QTableView的使用
Qt之QTableView
,这节讲解一下也较为常用的另外一个部件QTreeView,对于多层结构的显示来说,
QTreeView无非是最佳的选择。

 
Qt中有几种纯粹的视图部件:QListView、QTableView、QColumnView、QTreeView,所有的这些视图都必须提供一个模型(无论是自定义,还是Qt中已提供的)来与之配合。Qt仍然提供了一些
便利的窗口部件(“便利”是因为它们提供了自己内置的模型,并能直接使用),如:QListWidget、QTableWidget、和QTreeWidget。还有QComboBox,既是一个便利的窗口部件也是一个视图部件,也就是说,我们既可以直接使用(因为它提供了内置的模型),也能把它当做一个模型的视图部件(这种情况下,可以提供一个合适的模型给它)。
    之所以说
视图部件
常用,是因为在编程的过程当中经常遇到大数据集,使用视图/模型就显得更有效率。当然,对于数据集较小(数百或数千个项)的应用程序,选择便利部件比较合适。
    这节讲解中主要包括:
QTreeView模型视图的使用、自定义委托、自定义样式等。。。

这里提供三种样式,
先上效果图:
Qt之QTreeView(一)

Qt之QTreeView(一)

Qt之QTreeView(一)

模型/视图篇
(1)QTreeView节点项
#include #include "treeitem.h" TreeItem::TreeItem(const QList &data, TreeItem *parent) { parentItem = parent; itemData = data; } TreeItem::~TreeItem() { qDeleteAll(childItems); } void TreeItem::a(TreeItem *item) { childItems.append(item); } TreeItem *TreeItem::child(int row) { return childItems.value(row); } int TreeItem::childCount() const { return childItems.count(); } int TreeItem::columnCount() const { return itemData.count(); } QVariant TreeItem::data(int column) const { return itemData.value(column); } TreeItem *TreeItem::parent() { return parentItem; } int TreeItem::row() const { if (parentItem) return parentItem->childItems.indexOf(const_cast(this)); return 0; } 

(2)QAbstractItemModel模型
#include "treeitem.h" #include "treemodel.h" #include #include TreeModel::TreeModel(QObject *parent) : QAbstractItemModel(parent) { QList rootData; rootData << "Title"; rootItem = new TreeItem(rootData); } TreeModel::~TreeModel() { delete rootItem; } void TreeModel::setXML(QString xmlFile) { toolList = Util::parse(xmlFile); setupModelData(rootItem); } int TreeModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) return static_cast(parent.internalPointer())->columnCount(); else return rootItem->columnCount(); } QVariant TreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); TreeItem *item = static_cast(index.internalPointer()); ToolUtil toolUtil; for (int i = 0; i < toolList.count(); ++i) { toolUtil = toolList.at(i); if (toolUtil.id == item->data(0)) { break; } } if (role == Qt::DisplayRole) { return toolUtil.text; } else if (role == Qt::DecorationRole) { return QIcon(Util::exePath() + "\\Resources\\toolicon\\" + toolUtil.toolicon); } else if (role == Qt::ToolTipRole) { return toolUtil.tooltip; } else { return QVariant(); } } Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const { if (!index.isValid()) return 0; return QAbstractItemModel::flags(index); } QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) return rootItem->data(section); return QVariant(); } QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); TreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex(); } QModelIndex TreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); TreeItem *childItem = static_cast(index.internalPointer()); TreeItem *parentItem = childItem->parent(); if (parentItem == rootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } int TreeModel::rowCount(const QModelIndex &parent) const { TreeItem *parentItem; if (parent.column() > 0) return 0; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); return parentItem->childCount(); } TreeItem * TreeModel::item(TreeItem* item, ToolUtil tool) { TreeItem *treeItem = NULL; if (item == NULL) { return treeItem; } int parentId = tool.parentId; if (item->data(0) == parentId) { treeItem = item; } else { for (int j = 0; j < item->childCount(); ++j) { TreeItem *childItem = item->child(j); TreeItem *item2 = this->item(childItem, tool); if (item2) { treeItem = item2; break; } } } return treeItem; } void TreeModel::setupModelData(TreeItem *parent) { QList parents; parents << parent; for (int i = 0; i < toolList.count(); ++i) { ToolUtil tool = toolList.at(i); QList columnData; columnData << tool.id; for(int j = 0; j < parents.count(); ++j) { TreeItem* item = this->item(parents.at(j), tool); if (item) { item->a(new TreeItem(columnData, item)); } else { parents.last()->a(new TreeItem(columnData, parents.last())); } } } } 

 
  
 前几章已经对模型中的方法解释的很清楚了,所以这里就不再过多阐述!


注:
    技术在于交流、沟通,转载请注明出处并保持作品的完整性。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133663.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 初中英语语法(003)-be动词和一般动词的一般过去式

    初中英语语法(003)-be动词和一般动词的一般过去式be.动词和一般动词的过去式1、什么是过去式:当一个状态是当前的状态,或者一个动作发生在现在,那么就是现在时,动词要用现在式。当一个动作发生在过去,或者一个状态是过去的状态,现在已经没有了,那么就是过去时,动词要用过去式。因此,过去式用于过去的时间的状态和发生的事件。2、be.动词的过去式:be.动词的变化规则:am/is=&amp;gt;was,are=&amp;gt;were当时间副词改变的…

    2022年4月19日
    47
  • android ListView 嵌套 ListView

    android ListView 嵌套 ListView实现的效果是这个样子的看上去效果还是不错,不过现在有个刷新问题一直没能解决,刷新的时候里面的adapter进行刷新的时候总是会让里面的listview消失掉,应该是父listview先刷新完后,子listview还未刷新完成,导致测量的高度不对,就会消失,像当前组已关闭这种,现在这个问题还没有想到办法解决的,试过比较多的方法,添加接口让子listview刷新完成后再去更新父…

    2022年7月16日
    23
  • Matlab基本函数-length函数

    Matlab基本函数-length函数1、length函数:计算向量或矩阵的长度2、用法说明   y=length(x)函数计算指定向量或矩阵的长度y。如果参数变量x是向量,则返回其长度;如果参数变量是非空矩阵,则length(x)与max(size(x))等价3、举例说明>>x=’youhaidong’x=youhaidong>>y=length(x)y=10

    2022年6月12日
    68
  • 详解 & 0xff 的意义及作用

    详解 & 0xff 的意义及作用首先我们要都知道,&表示按位与,只有两个位同时为1,才能得到1,0x代表16进制数,0xff表示的数二进制11111111占一个字节.和其进行&操作的数,最低8位,不会发生变化.下面着重来说说&0xff都有哪些应用:1.只是为了取得低八位通常配合移位操作符>>使用例如:javasocket通信中基于长度的成帧方法中,如果发送的信息长度小于65535字节,长度信息的字节定义为两个字节长度。这时候将两个字节长的长度信息,以Big-Endian的

    2022年6月19日
    48
  • dijkstra算法详解—简单易懂[通俗易懂]

    dijkstra算法详解—简单易懂[通俗易懂]dijkstra算法详解(迪杰斯特拉算法)~~简单易懂,代码附有详细注释,含动态演示图片

    2025年8月13日
    3
  • Java反射机制及其使用

    Java反射机制及其使用文章目录1Java反射机制概述2反射及其使用2.1关于类java.lang.Class2.2类的加载2.2.1类的加载过程2.2.2类加载器2.3反射的使用2.3.1创建运行时类的对象2.3.2获取运行时类的属性结构2.3.3获取运行时类的方法结构2.3.4获取运行时类的构造器结构2.3.5获取运行时类的父类信息2.3.6获取运行时类实现的接口2.3.7获取运行时类声明的注解2.3.7获取运行时类所在的包2.3.8调用类的构造函数、操作类的属性、调用类中方法1Java

    2022年7月8日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号