自定义QTreeView

Qt之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模型视图的使用、自定义委托、自定义样式等。。。

这里提供三种样式, 先上效果图:
自定义QTreeView_第1张图片

自定义QTreeView_第2张图片

自定义QTreeView_第3张图片

模型/视图篇
(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())); } } } } 
      前几章已经对模型中的方法解释的很清楚了,所以这里就不再过多阐述!


注:
    技术在于交流、沟通,转载请注明出处并保持作品的完整性。
     作者: ╰☆奋斗ing❤孩子`    原文: http://blog.sina.com.cn/s/blog_a6fb6cc90102v7q8.html。

你可能感兴趣的:(自定义QTreeView)