本文属于《QTreeView使用系列教程》之一,欢迎查看其它文章。

一、给树中item添加图标

接下来,我们分别给"省份"、"人口"添加不同图标。

首先,在TreeItem.cpp中添加getIcon函数,默认只有第一列"姓名"才允许有图标,再根据当前item类型,分别返回不同图标。

QVariant TreeItem::getIcon(int column)
{if (column != COLUMN_NAME)return QVariant();if(_type == PROVINCE){return QIcon(":/res/province.png");}else if (_type == PERSON){return QIcon(":/res/person.png");}return QVariant();
}

然后,我们在TreeModel.cpp中data()下,添加DecorationRole角色处理,这个就是代表需要返回图标的role。我们调用前面写好的函数返回图标。

QVariant TreeModel::data(const QModelIndex &index, int role) const
{if (!index.isValid())return QVariant();TreeItem *item = itemFromIndex(index);if (role == Qt::DisplayRole){return item->data(index.column());}else if (role == Qt::DecorationRole) {return item->getIcon(index.column());}return QVariant();
}

效果:

二、给树中item添加CheckBox

接下来,我们为表项添加复选框。

首先,在TreeItem.cpp中添加3个函数,分别用于提供勾选状态给model,以及界面勾选状态改变后,保存新勾选状态值。checkable()用于判断当前item是否允许勾选。

bool TreeItem::isChecked() const { return _checked; }
void TreeItem::setChecked(bool check) { _checked = check; }
bool TreeItem::checkable(int column) const
{if (column != COLUMN_NAME) // 除第一列外,其他列不允许勾选{return false;}if(_type == PERSON) // 第一列中只允许"人口"勾选{return true;}return false;
}

然后,我们在TreeModel.cpp中data()下,添加CheckStateRole角色处理,这个就是代表需要返回勾选状态。我们调用前面写好的函数返回勾选状态。

QVariant TreeModel::data(const QModelIndex &index, int role) const
{if (!index.isValid())return QVariant();TreeItem *item = itemFromIndex(index);if (role == Qt::DisplayRole){return item->data(index.column());}else if (role == Qt::DecorationRole) {return item->getIcon(index.column());}else if (role == Qt::CheckStateRole){if (item->checkable(index.column())){return item->isChecked() ? Qt::Checked : Qt::Unchecked;}return QVariant();}return QVariant();
}

此时,我们发现CheckBox已经可以显示出来了,但是不能勾选。

我们还需要在TreeModel.cpp中添加2个基类重写函数:

在flags函数中根据item的checkable()判断当前item是否允许勾选,然后将结果flags返回。若没有重写这个flags函数,在界面上就无法勾选CheckBox。

Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{if (!index.isValid())return QAbstractItemModel::flags(index);Qt::ItemFlags flags = QAbstractItemModel::flags(index);TreeItem *item = itemFromIndex(index);if (item->checkable(index.column())){flags |= Qt::ItemIsUserCheckable;}return flags;
}

重写flags()后,相当于有操作CheckBox权限了,但是check状态也是需要保存的,所以状态改变后,需要我们保存下来,下次界面刷新才能显示check上。
重写setData函数,同样根据checkable()判断当前item是否允许勾选,若允许,则将check状态保存到item中,并发送dataChanged信号,返回true。

bool TreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
{if (!index.isValid())return false;if (role == Qt::CheckStateRole){TreeItem *item = itemFromIndex(index);if (!item->checkable(index.column())){return false;}item->setChecked(value.toInt() == Qt::Checked);emit dataChanged(index, index);return true;}return false;
}

到此,我们的CheckBox就添加好了,并且也能够勾选了。

三、CheckBox的勾选改变处理

对model添加信号槽处理,捕获数据改变信号

TreeModel* model = new TreeModel(headers, treeView);
connect(model, &QAbstractItemModel::dataChanged,this, &MainWindow::onTreeDataChanged);
void MainWindow::onTreeDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
{TreeItem *item = static_cast<TreeItem*>(topLeft.internalPointer());if (item->checkable(topLeft.column())){QString name = item->data(COLUMN_NAME).toString();if (item->isChecked()){qDebug() << "checked:" << name;}else{qDebug() << "unchecked:" << name;}}
}

效果:


若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

本文涉及工程代码,公众号回复:34AddCheckIcon,即可下载。

《给QTreeView表项添加CheckBox和图标》:系列教程之七相关推荐

  1. keil如何添加h文件_ECBM系列教程1:如何搭建ECBM库环境。

    STC8属于8051单片机,发展到现在已经是带流水线的版本了,不过依然还是支持8051的指令集.因此任何支持8051的IDE都可以用来开发STC8单片机. 不过由于ECBM库的一些特性,我们只使用KE ...

  2. jooq多表查询_二、jOOQ 系列教程 - 基础CURD

    通过 DSLContext API 和 Record API,可以完成基础CURD操作.本篇主要通过一些实例代码,讲解最基础的用法.后面的相关篇幅中,也会说到一些扩展以及其他高级用法 从此篇幅开始,以 ...

  3. java 获取项目下的webapp_Spring Boot2 系列教程(一)纯 Java 搭建 SSM 项目

    在 Spring Boot 项目中,正常来说是不存在 XML 配置,这是因为 Spring Boot 不推荐使用 XML ,注意,并非不支持,Spring Boot 推荐开发者使用 Java 配置来搭 ...

  4. 注册表的作用、bat文件中REG ADD命令添加注册表项以及bat

    注册表的用途与设置 注册表是windows的核心,里面储存着大量的系统信息,说白了就是一个庞大的数据库.如果你不懂什么是数据库,那没关系,不影响你了解注册表,不过最好对数据库有所了解.注册表里面所有的 ...

  5. ExtJS4为form表单必填项添加红色*标识

    通常情况下,ExtJS4的form表单必填项在输入状态下会有特殊提示,非输入状态下,显示却和其他项没有任何区别.为使必填项更加容易区分,我们需要根据allowBlank的属性值,为form表单中的必填 ...

  6. 在Power BI表单中添加图标

    在Power BI图表中一般只能显示纯文本数字信息,想要显示图片的话,要么需要找一个地方把图片存储下来然后进行引用,要么就需要转换成Base64编码再进行显示. 如果只是想在表单中添加一些图标,用来标 ...

  7. 用批处理文件在注册表中添加开机启动项

    reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v myauto /t REG_SZ /d C:\1 ...

  8. 《uni-app》表单组件-Checkbox组件

    本文分享的checkbox组件为uni-app的内置组件checkbox,非扩展组件,两者在用法上其实大同小异,只是扩展组件的属性以及事件更多-没有本质上的区别- <uni-app>表单组 ...

  9. 向工作表中添加列表框或组合框

    http://office.microsoft.com/zh-cn/excel-help/HP010236681.aspx 添加列表框(表单控件) 如果"开发工具"选项卡未显示,请 ...

  10. 木马爱修改的常见注册表项及其功能

    IE相关: 设置IE多线程下载网页的线程数: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings ...

最新文章

  1. [Java]学习Java(4)类、接口、语句
  2. 毕业生必须知道:干部身份、三方协议、派遣证
  3. 局部变量和成员变量的初始值问题
  4. 【SpringBoot + Docker】编写Dockerfile安装jdk11.0.3,并部署SpringBoot项目
  5. webx学习(二)——Webx Framework
  6. SQL基础:数据表的创建
  7. 数据库SQL命令经典面试题65道
  8. ECShop 安装问题 谁能帮帮我
  9. Linux环形缓冲区原理
  10. 移动web-margin塌陷
  11. VPC下访问FTP的问题
  12. java POI导出excel性能优化
  13. labview入门系列2
  14. 《EDA前端软件开发工程师面试指南》
  15. E680手机内存已满终极解决方案
  16. strut2下载文件
  17. 项目日志20190704
  18. ar军事作战数字三维仿真沙盘开发
  19. org.apache.thrift.transport.TTransportException: GSS initiate failed
  20. idea常用护眼色的RGB值调整

热门文章

  1. LS-DYNA基础理论
  2. 如何免费CAJ完整转换成Word
  3. 读书笔记-整理的艺术
  4. 新会计准则(New Edition of Accounting Standard)
  5. [张国荣][21CD][1998-2002][APE+CUE][8.00G][115][sqhhj0622#HD2PT]
  6. 爬虫学习笔记(四)——糗百爬虫遇到的反爬
  7. 为什么说CCSK是云安全从业人员必备证书之一
  8. Golang8小时基础入门
  9. 项目管理工具——PDCA管理循环
  10. VirtualBox基础使用教程