《给QTreeView表项添加CheckBox和图标》:系列教程之七
本文属于《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和图标》:系列教程之七相关推荐
- keil如何添加h文件_ECBM系列教程1:如何搭建ECBM库环境。
STC8属于8051单片机,发展到现在已经是带流水线的版本了,不过依然还是支持8051的指令集.因此任何支持8051的IDE都可以用来开发STC8单片机. 不过由于ECBM库的一些特性,我们只使用KE ...
- jooq多表查询_二、jOOQ 系列教程 - 基础CURD
通过 DSLContext API 和 Record API,可以完成基础CURD操作.本篇主要通过一些实例代码,讲解最基础的用法.后面的相关篇幅中,也会说到一些扩展以及其他高级用法 从此篇幅开始,以 ...
- java 获取项目下的webapp_Spring Boot2 系列教程(一)纯 Java 搭建 SSM 项目
在 Spring Boot 项目中,正常来说是不存在 XML 配置,这是因为 Spring Boot 不推荐使用 XML ,注意,并非不支持,Spring Boot 推荐开发者使用 Java 配置来搭 ...
- 注册表的作用、bat文件中REG ADD命令添加注册表项以及bat
注册表的用途与设置 注册表是windows的核心,里面储存着大量的系统信息,说白了就是一个庞大的数据库.如果你不懂什么是数据库,那没关系,不影响你了解注册表,不过最好对数据库有所了解.注册表里面所有的 ...
- ExtJS4为form表单必填项添加红色*标识
通常情况下,ExtJS4的form表单必填项在输入状态下会有特殊提示,非输入状态下,显示却和其他项没有任何区别.为使必填项更加容易区分,我们需要根据allowBlank的属性值,为form表单中的必填 ...
- 在Power BI表单中添加图标
在Power BI图表中一般只能显示纯文本数字信息,想要显示图片的话,要么需要找一个地方把图片存储下来然后进行引用,要么就需要转换成Base64编码再进行显示. 如果只是想在表单中添加一些图标,用来标 ...
- 用批处理文件在注册表中添加开机启动项
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v myauto /t REG_SZ /d C:\1 ...
- 《uni-app》表单组件-Checkbox组件
本文分享的checkbox组件为uni-app的内置组件checkbox,非扩展组件,两者在用法上其实大同小异,只是扩展组件的属性以及事件更多-没有本质上的区别- <uni-app>表单组 ...
- 向工作表中添加列表框或组合框
http://office.microsoft.com/zh-cn/excel-help/HP010236681.aspx 添加列表框(表单控件) 如果"开发工具"选项卡未显示,请 ...
- 木马爱修改的常见注册表项及其功能
IE相关: 设置IE多线程下载网页的线程数: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings ...
最新文章
- [Java]学习Java(4)类、接口、语句
- 毕业生必须知道:干部身份、三方协议、派遣证
- 局部变量和成员变量的初始值问题
- 【SpringBoot + Docker】编写Dockerfile安装jdk11.0.3,并部署SpringBoot项目
- webx学习(二)——Webx Framework
- SQL基础:数据表的创建
- 数据库SQL命令经典面试题65道
- ECShop 安装问题 谁能帮帮我
- Linux环形缓冲区原理
- 移动web-margin塌陷
- VPC下访问FTP的问题
- java POI导出excel性能优化
- labview入门系列2
- 《EDA前端软件开发工程师面试指南》
- E680手机内存已满终极解决方案
- strut2下载文件
- 项目日志20190704
- ar军事作战数字三维仿真沙盘开发
- org.apache.thrift.transport.TTransportException: GSS initiate failed
- idea常用护眼色的RGB值调整
热门文章
- LS-DYNA基础理论
- 如何免费CAJ完整转换成Word
- 读书笔记-整理的艺术
- 新会计准则(New Edition of Accounting Standard)
- [张国荣][21CD][1998-2002][APE+CUE][8.00G][115][sqhhj0622#HD2PT]
- 爬虫学习笔记(四)——糗百爬虫遇到的反爬
- 为什么说CCSK是云安全从业人员必备证书之一
- Golang8小时基础入门
- 项目管理工具——PDCA管理循环
- VirtualBox基础使用教程