之前有讲解过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()));
}
}
}
}
前几章已经对模型中的方法解释的很清楚了,所以这里就不再过多阐述!
注:
技术在于交流、沟通,转载请注明出处并保持作品的完整性。