自定义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)
上一篇 2022年6月8日 上午6:46
下一篇 2022年6月8日 上午6:46


相关推荐

  • pyinstall 常见错误

    pyinstall 常见错误字符编码错误 https blog csdn net weixin article details https blog csdn net article details nltk data 相关错误 https stackoverflo com questions 5465

    2026年3月17日
    2
  • plsql 查询到别的用户下面的表

    plsql 查询到别的用户下面的表

    2021年9月1日
    51
  • springboot实现拦截器_Spring拦截器

    springboot实现拦截器_Spring拦截器集成拦截器登录验证为例添加拦截器public class LoginInterceptor implements HandlerInterceptor { private Logger log = LoggerFactory.getLogger(getClass()); //Controller逻辑执行之前 @Override public boolean preHandle(HttpServletRequest request, HttpServletRe

    2022年8月8日
    11
  • 一套键盘鼠标跨电脑切换使用「建议收藏」

    一套键盘鼠标跨电脑切换使用「建议收藏」       身为一名涉猎领域广泛的码农,工作间中往往会出现同时使用超过一台电脑的场景,笔记本+台式机基本是常态,甚至会出现Win+MAC或者Win+LINUX这样的跨平台同时操作需求。那么最令人烦恼的莫过于切换使用电脑时需要来回切换键鼠,如果可以用桌面上的一套键鼠,实现对多台电脑的无缝操作切换,岂不是美滋滋。      博主这样的愿望由来已久,今日终于完美解决,特分享给诸位道友。  …

    2022年10月10日
    4
  • 详解SpringBoot整合Mybatis框架

    详解SpringBoot整合Mybatis框架文章目录前言一 创建 SpringBoot 项目二 配置 Mybatis1 在 pom xml 文件中添加 jar 包依赖 2 SpringBoot 整合 Mybatis 配置文件三 创建 Mapper 接口四 创建 XML 映射文件五 测试是否整合成功总结前言人生是一段旅程 走过的路 就是你编织的生活 我们无法预知以后的路途 但是 我们能把握现在的自己 珍惜身边的一切 脚踏实地的走 走好自己的路 不在生命里给自己留下遗憾的风景 对于企业开发来说 稳定性和便捷性是最重要的两个特性 SpringBoot 更像是一个框架的框架

    2025年8月30日
    4
  • java actioncontext_关于struts2中ActionContext的实现原理

    java actioncontext_关于struts2中ActionContext的实现原理北京,雾霾天气阻止了今天的马拉松之行,蜗居一天。为一个问题“struts2如何保证ActionContext每次取的都是本次请求所对应的实例?”,给一个网友解释了半天。首先,我们知道,struts2和struts1的一个重要区别就是它进行了Action类和Servlet的解耦。而又提供了获取ServletAPI的其它通道,就是ActionContext(别跟我说还有个ServletActionC…

    2025年10月14日
    8

发表回复

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

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