自定义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())); } } } } 

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


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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • php 除法取两位小数,php中除法取整的方法(round,ceil,floor)「建议收藏」

    php 除法取两位小数,php中除法取整的方法(round,ceil,floor)「建议收藏」PHP中遇到需要将除法所得结果取整的情况时,就需要用到以下方法:1.round:四舍五入round()函数对浮点数进行四舍五入。语法:round(x,prec)参数描述x可选。规定要舍入的数字。prec可选。规定小数点后的位数。说明:返回将x根据指定精度prec(十进制小数点后数字的数目)进行四舍五入的结果。prec也可以是负数或零(默认值)。提示:PHP默认不能正确处理类似”…

  • 关于input type=“file”的及其files对象的深层探究

    关于input type=“file”的及其files对象的深层探究我们都知道,html5中有个inputtype=file元素。用该元素可以实现页面上传文件的功能但一般的做法只是简单的在表单中操作,我来研究一下深层东西想要了解它,就要知道它的内置对象,files页面上写一个input,然后选俩个图片,打印这个input对象$(“input[name=’file1′]”).change(function(e){console.log…

  • extremeDB_shiro使用详解

    extremeDB_shiro使用详解1、准备工作:下载eXtremeDB安装包(http://www.leadingtek.com.cn/)然后将安装或解压至磁盘。此时可以看到其目录下有host、include、platform和target等目录。2、用你喜欢的文本编辑器构建一数据库结构,文本内容如下:(举例说明,保存文件名为test.mco)#defineint1    signed#definein

    2022年10月10日
  • PHP实现图片的等比缩放和Logo水印功能示例

    PHP实现图片的等比缩放和Logo水印功能示例

    2021年10月25日
  • mysql和sqlserver的区别_sql server和MySQL

    mysql和sqlserver的区别_sql server和MySQL1、mysql支持enum,和set类型,sqlserver不支持2、mysql不支持nchar,nvarchar,ntext类型3、mysql的递增语句是AUTO_INCREMENT,而sql

  • python入门教程(非常详细)下载_古典吉他入门零基础

    python入门教程(非常详细)下载_古典吉他入门零基础世界上没有绝对的公平,如果我们起点就比别人第一步,那就更需要比别人努力了。每天比别人努力多一点点,就会有很大的突破。你必须特别努力,才能显得毫不费力。期待你成为理想中的自己那一天,加油!

发表回复

您的电子邮箱地址不会被公开。

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