QT笔记- QTreeView设置三态setAutoTristate() 树形视图自动复选框——源码分享
说明
Qt中函数QStandardItem::setAutoTristate()无实际功能,仅作为一个布尔标记。若要实现自动三态复选框功能,需要自行代码构建。
本文通过编写两个派生类,完成了这个功能。类源码和一个示例如下:
源码
//[自动三态item](用于AutoTristateTreeView)
#include "QStandardItem"
class AutoTristateItem : public QStandardItem
{struct{int oldCheckState;bool oldShock;}info;void setAutoTristate(bool tristate);
public:AutoTristateItem() : QStandardItem(){info.oldCheckState = checkState(); info.oldShock = isAutoTristate();}AutoTristateItem(const QString &text) : QStandardItem(text){info.oldCheckState = checkState(); info.oldShock = isAutoTristate();}int oldCheckState(){return info.oldCheckState;}void updateOldCheckState(){info.oldCheckState = checkState();}//setCheckState()后一般要调用一下该函数, 否则下一次可能不会触发后面的树//触发当前item之下的所有树的check box与当前item保持一致void shocking(){info.oldShock = isAutoTristate(); QStandardItem::setAutoTristate(!info.oldShock);}bool oldShock(){return info.oldShock;}
};//[自动三态树形视图]
#include "QTreeView"
class AutoTristateTreeView : public QTreeView
{Q_OBJECT
public:enum AutoMode{AutoTristateMode,//必须同时设置setUserTristate(true)AutoTwoStateMode,//必须同时设置setUserTristate(false)None};explicit AutoTristateTreeView(QWidget *parent = 0) : QTreeView(parent){}virtual void setModel(QStandardItemModel *model);AutoMode autoMode(){return info.autoMode;}void setAutoMode(AutoMode mode){info.autoMode = mode;}
signals:void tristate_changed_(AutoTristateItem *item);//发送出check box发生变动的item
private slots:void _item_changed(QStandardItem *item);
private:struct{AutoMode autoMode = None;}info;
};
实现:
void AutoTristateTreeView::setModel(QStandardItemModel *model)
{QTreeView::setModel(model);connect(model, &QStandardItemModel::itemChanged, this, &AutoTristateTreeView::_item_changed);
}void AutoTristateTreeView::_item_changed(QStandardItem *item)
{// cout << "AutoTristateTreeView::_item_changed - " << endl;if(((AutoTristateItem *)item)->oldCheckState() != item->checkState() ||//区分是否是checked的改变((AutoTristateItem *)item)->oldShock() != item->isAutoTristate()){if(((AutoTristateItem *)item)->oldCheckState() != item->checkState()){((AutoTristateItem *)item)->updateOldCheckState();emit tristate_changed_((AutoTristateItem *)item);cout << "AutoTristateTreeView::_item_changed - Changed item:"<< qPrintable(item->text()) << endl;}for(int i = 0; i < item->rowCount(); ++i) {//只需控制其直接child即可switch (info.autoMode) {case AutoTristateMode:if(item->child(i)->isUserTristate()){if(item->child(i)->checkState() == item->checkState())((AutoTristateItem *)(item->child(i)))->shocking();else item->child(i)->setCheckState(item->checkState());}break;case AutoTwoStateMode:if(!item->child(i)->isUserTristate()){if(item->child(i)->checkState() == item->checkState())((AutoTristateItem *)(item->child(i)))->shocking();else item->child(i)->setCheckState(item->checkState());}break;default:break;}}}
}
示例:
AutoTristateTreeView类中带有一个信号函数tristate_changed_(),用于将复选框发生变动的item发送出去。下面示例中使用了这个信号,用于将触发的item输出到窗口,但这里并没有贴出其槽函数的实现。
QStandardItemModel * model = new QStandardItemModel;
AutoTristateItem * item = new AutoTristateItem("test");
item->setCheckable(true);
item->setUserTristate(true);
AutoTristateItem * item2 = new AutoTristateItem("test_2");
item2->setCheckable(true);
item2->setUserTristate(true);
item->appendRow(item2);
AutoTristateItem * item3 = new AutoTristateItem("test_3");
item3->setCheckable(true);
item3->setUserTristate(true);
item->appendRow(item3);
AutoTristateItem * item4 = new AutoTristateItem("test_4");
item4->setCheckable(true);
item4->setUserTristate(true);
item3->appendRow(item4);
model->appendRow(item);ui->treeView->setModel(model);
ui->treeView->setAutoMode(AutoTristateTreeView::AutoTristateMode);
connect(ui->treeView, &AutoTristateTreeView::tristate_changed_, this, &Widget::_tristate_changed);
调试:
QT笔记- QTreeView设置三态setAutoTristate() 树形视图自动复选框——源码分享相关推荐
- element表格实现树形全选_vue+element UI实现树形表格带复选框的示例代码
一:在component文件夹下新建如下treeTable文件夹,里面有2个文件: eval.js:将数据转换成树形数据 /** * @Author: jianglei * @Date: 2017-1 ...
- vue+element ui实现树形表格加复选框(checkbox)
element ui中有带复选框的表格和树形数据的表格,不过呢,wo遇到一个新的需求,其中就是要实现树形表格和复选框的结合,尝试过很多方法,最后自己总结出一套,实现了全选,单选,多选. 效果图: 代码 ...
- QAbstractItemView子类如:QTreeView、QTableView等子项单元格复选框勾选/取消勾选功能实现
1.前言 本博文所说的技术点适用于同时满足下面条件的所有QAbstractItemView视图类的子类: 模型类从 QAbstractItemModel派生. 代理类从QStyledItemDeleg ...
- 安卓学习笔记19:常用控件 - 单选按钮和复选框
文章目录 零.学习目标 一.单选按钮组 1.继承关系图 2.常用属性 3.事件监听器 4.注意事项 5.重要方法 二.单选按钮 1.继承关系图 2.常用方法 3.事件监听器 4.注意事项 三.复选框 ...
- 用python实现复选框树_如何使用Python中的复选框创建树视图
我一直在使用Tkinter和Tix来编写一个小程序. 我在需要一个树状视图的复选框(检查按钮),所以我可以从树视图中选择项目. 有没有办法做到这一点? 我一直在看ttk.Treeview(),它看起来 ...
- QTreeView 动态设置复选框
目录 动态设置复选框的步骤 QT MVC的概念 模型 添加数据 获取数据 视图 槽函数 动态设置复选框的步骤 初始化一个QTreeView 的界面,并设置相关的model // 在ui中新建两个QTr ...
- 带复选框和简单描述的Qt QTreeWidget树形控件的简单使用
Qt QTreeWidget树形控件的简单使用 具有选择框的树形控件 具有选择框的树形控件 效果:当选中顶层的树形节点时,子节点全部被选中:当取消选中顶层树形节点时,子节点全部被取消:当选中子节点时, ...
- ag-grid 学习笔记三:ag-grid设置(定义列、选择行、复选框、设置行高列宽、置顶合计行、底部合计行、行组、客户端排序)
目录 一 定义列 二 选择行 三 设置复选框 四 设置行高列宽 五 置顶合计行 六 底部合计行 七 行组 八 客户端排序 一 定义列 表格的列有如下常用属性. 名称 说明 headerName 显示的 ...
- 什么标签用于在表单中构建复选框_UI/UX笔记之如何设计好表单
原文链接: UI/UX笔记之如何设计好表单 | 须臾所学免费设计资源网presentationvip.com 无论是注册流程,多视图步骤程序还是单调的数据输入界面,表单都是数字产品设计中最重要的组成 ...
最新文章
- Quartz1.X中CronTrigger第一次启动的问题
- python 获取文件列表
- 面试pythone_python面试常见问题有哪些
- oracle ogg00423,【案例】Oracle报错PLS-00378 PLS-00439产生原因和MOS官方解决办法
- WeChatTweak-微信小助手安装教程
- Spring Boot CLI设置和HelloWorld示例
- SpringBoot集成MyBatis-Plus代码生成器
- 工信部拟规定基本功能软件外的预置App均可卸载
- 手机网络游戏SDK集成指南
- outlook搜索栏跑到上面去了_南昌搜索引擎seo优化
- Supervisor 自动管理进程
- matlab-plot绘制点线图
- JTT808、JTT809、JTT796、JTT794、JTT1077、JTT1078区别与交通部道路运输车辆卫星定位系统部标标准大全下载地址...
- 氨基酸序列碎裂by离子-生物信息学笔记
- android 显示和风天气字体图标
- 自己开发iOS版按键精灵--TTouch
- windows/ps使用技巧
- shell脚本监控网站是否正常
- win7 桌面计算机不显示器,Win7电脑显示器模糊怎么办?
- 计算机术语桢什么意思,120桢什么意思
热门文章
- 微信向下滑动怎么传参服务器,微信小程序 - 传参的几种方式
- python 之 *args 和 **kwargs的区别
- 接入顶象技术小程序验证码全过程
- 支持多个git服务器的ssh配置方法及ssh config配置解释以及ssh-agent简单介绍
- entainment
- android拷贝喜马拉雅节目到music目录
- jpg转换成pdf应该怎么做
- 7zip linux 使用方法,Linux中的压缩软件7-zip的使用教程
- 81章 老子1章到_【图片】《道德经》读书笔记(希望从第1章到81章善始善终)【老子吧】_百度贴吧...
- Oracle安装 配置 使用 方法总结