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