中易网

如何给QTreeView的节点显示图标

答案:1  悬赏:30  
解决时间 2021-03-10 10:07
如何给QTreeView的节点显示图标
最佳答案
一. 树形结构体定义 treeitem.h
Cpp代码

class TreeItem
{
public:
TreeItem(const QList<QVariant> &data,TreeItem *parent=0 );
~TreeItem();

void appendChild(TreeItem *child);
TreeItem *child(int row);
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
int row() const;
TreeItem *parent();

private:
TreeItem *parentItem; // 父结点
QList<TreeItem*> childItems; // 子结点列表
QList<QVariant> itemData; // 子节点对应数据
};

二. 树形model实现
Cpp代码
#include <QAbstractItemModel>
#include "TreeItem.h"

class TagTreeModel : public QAbstractItemModel
{
Q_OBJECT

public:
TagTreeModel(QObject *parent = 0);
~TagTreeModel();

QVariant data(const QModelIndex &index, int role) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const;
QModelIndex index(int row, int column,
const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &index) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;

// 构建模型数据
void setupModelData(TreeItem *parent);

// 更新模型数据
void updateData();

private:
TreeItem *rootItem; // 最顶层顶根节点(一个无效的QModelIndex)
};

TagTreeModel.cpp
Cpp代码
#include "TagTreeModel.h"
#include <QtGui>

TagTreeModel::TagTreeModel(QObject *parent):QAbstractItemModel(parent)
{
rootItem=NULL;

updateData();
}

TagTreeModel::~TagTreeModel()
{
delete rootItem;
}

void TagTreeModel::updateData()
{
// 废弃旧的模型数据
if(rootItem)
{
delete rootItem;
rootItem=NULL;
}

QList<QVariant> rootData;
rootData<<"Tag"<<"Type";

rootItem=new TreeItem(rootData);
setupModelData(rootItem);

// 刷新模型
reset();
}

QVariant TagTreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();

// 添加图标
if(role==Qt::DecorationRole&&index.column()==0)
return QIcon("images/fold.png");

// 显示节点数据值
if(role==Qt::DisplayRole)
{
TreeItem *item=static_cast<TreeItem*>(index.internalPointer());
return item->data(index.column());
}

return QVariant();
}

Qt::ItemFlags TagTreeModel::flags(const QModelIndex &index) const
{
if(!index.isValid())
return 0;

return Qt::ItemIsEnabled|Qt::ItemIsSelectable;
}

QVariant TagTreeModel::headerData(int section, Qt::Orientation orientation,int role) const
{
if(orientation==Qt::Horizontal&&role==Qt::DisplayRole)
return rootItem->data(section);

return QVariant();
}

QModelIndex TagTreeModel::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<TreeItem*>(parent.internalPointer());
}

TreeItem *childItem=parentItem->child(row);
if(childItem)
return createIndex(row,column,childItem); // 展开树形,为子节点建立索引
else
return QModelIndex();
}

QModelIndex TagTreeModel::parent(const QModelIndex &index) const
{
if(!index.isValid())
return QModelIndex();

TreeItem *childItem=static_cast<TreeItem*>(index.internalPointer());
TreeItem *parentItem=childItem->parent();

// 顶层节点,直接返回空索引
if(parentItem==rootItem)
return QModelIndex();

// 为父结点建立索引
return createIndex(parentItem->row(),0,parentItem);
}

int TagTreeModel::rowCount(const QModelIndex &parent) const
{
TreeItem *parentItem;

if(!parent.isValid())
parentItem=rootItem;
else
parentItem=static_cast<TreeItem*>(parent.internalPointer());

return parentItem->childCount(); // 返回父结点下子结点数目
}

int TagTreeModel::columnCount(const QModelIndex &parent ) const
{
return rootItem->columnCount();
}

// 设置模型数据,构建包含10个根结点,每个根结点包含两个子节点的树形结构
void TagTreeModel::setupModelData(TreeItem *parent)
{
for(int i=0;i<10;i++)
{
QList<QVariant> datas;
datas<<QString("设备-%1").arg(i+1)<<QString("类型-%1").arg(i+1);

// 主结点下挂两个子节点
TreeItem *primary=new TreeItem(datas,parent);
parent->appendChild(primary);

for(int j=0;j<2;j++)
{
QList<QVariant> ds;
ds<<QString("子设备-%1").arg(j+1)<<QString("子类型-%1").arg(j+1);

primary->appendChild(new TreeItem(ds,primary));
}
}
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我对女人不感兴趣,我父母整天催我带女朋友回
新公司没有员工,工商年报从业人员怎么填?能
初潮以后的女孩子身高还能长多少
the teacher has told me many times not to
一味崇尚节俭,不鼓励消费,可能出现什么问题
怎么才能把边长为20cm的正四边形画成正八边形
S338/S243(旧)(路口)在什么地方啊,我要过去
八月份的那一个月时候有多少天。
男 十九岁 除了学手艺 还有什么较有前途的职
俐海药业好药师大药房个旧店在哪里啊,我有事
双重人格的第二人格什么时候出来
4399游戏小盒子删除不了怎么办
平板电脑经摔吗?不小心摔了,屏幕朝下,把偶
房山十渡风景名胜区-千年观音洞地址在什么地
菜鸟驿站(全家新松江路店)地址在哪,我要去那
推荐资讯
在家里做姐姐好不好
买房全款后,抵押贷款合适,还是首付完再贷款
蜡印象·桂林3D人文主题蜡像馆我想知道这个在
您好!我家是吉林榆树市农村的,事情是这样的
2017年一定红的动物(打一动物)
日语【ご绍介いただきます】中的【いただきま
这个爱奇艺也太黑了吧,看个海贼王都要会员
基本长拳总共多少招式?
中国联通(永恒营业厅)(广场路冷江大桥北55米
怀孕怎样防止长妊娠纹?
PSP的寂静岭 起源 无法开始游戏!!??
农银人寿买了三个月,退保要扣多少?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?