说明

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() 树形视图自动复选框——源码分享相关推荐

  1. element表格实现树形全选_vue+element UI实现树形表格带复选框的示例代码

    一:在component文件夹下新建如下treeTable文件夹,里面有2个文件: eval.js:将数据转换成树形数据 /** * @Author: jianglei * @Date: 2017-1 ...

  2. vue+element ui实现树形表格加复选框(checkbox)

    element ui中有带复选框的表格和树形数据的表格,不过呢,wo遇到一个新的需求,其中就是要实现树形表格和复选框的结合,尝试过很多方法,最后自己总结出一套,实现了全选,单选,多选. 效果图: 代码 ...

  3. QAbstractItemView子类如:QTreeView、QTableView等子项单元格复选框勾选/取消勾选功能实现

    1.前言 本博文所说的技术点适用于同时满足下面条件的所有QAbstractItemView视图类的子类: 模型类从 QAbstractItemModel派生. 代理类从QStyledItemDeleg ...

  4. 安卓学习笔记19:常用控件 - 单选按钮和复选框

    文章目录 零.学习目标 一.单选按钮组 1.继承关系图 2.常用属性 3.事件监听器 4.注意事项 5.重要方法 二.单选按钮 1.继承关系图 2.常用方法 3.事件监听器 4.注意事项 三.复选框 ...

  5. 用python实现复选框树_如何使用Python中的复选框创建树视图

    我一直在使用Tkinter和Tix来编写一个小程序. 我在需要一个树状视图的复选框(检查按钮),所以我可以从树视图中选择项目. 有没有办法做到这一点? 我一直在看ttk.Treeview(),它看起来 ...

  6. QTreeView 动态设置复选框

    目录 动态设置复选框的步骤 QT MVC的概念 模型 添加数据 获取数据 视图 槽函数 动态设置复选框的步骤 初始化一个QTreeView 的界面,并设置相关的model // 在ui中新建两个QTr ...

  7. 带复选框和简单描述的Qt QTreeWidget树形控件的简单使用

    Qt QTreeWidget树形控件的简单使用 具有选择框的树形控件 具有选择框的树形控件 效果:当选中顶层的树形节点时,子节点全部被选中:当取消选中顶层树形节点时,子节点全部被取消:当选中子节点时, ...

  8. ag-grid 学习笔记三:ag-grid设置(定义列、选择行、复选框、设置行高列宽、置顶合计行、底部合计行、行组、客户端排序)

    目录 一 定义列 二 选择行 三 设置复选框 四 设置行高列宽 五 置顶合计行 六 底部合计行 七 行组 八 客户端排序 一 定义列 表格的列有如下常用属性. 名称 说明 headerName 显示的 ...

  9. 什么标签用于在表单中构建复选框_UI/UX笔记之如何设计好表单

    原文链接: UI/UX笔记之如何设计好表单 | 须臾所学免费设计资源网​presentationvip.com 无论是注册流程,多视图步骤程序还是单调的数据输入界面,表单都是数字产品设计中最重要的组成 ...

最新文章

  1. Quartz1.X中CronTrigger第一次启动的问题
  2. python 获取文件列表
  3. 面试pythone_python面试常见问题有哪些
  4. oracle ogg00423,【案例】Oracle报错PLS-00378 PLS-00439产生原因和MOS官方解决办法
  5. WeChatTweak-微信小助手安装教程
  6. Spring Boot CLI设置和HelloWorld示例
  7. SpringBoot集成MyBatis-Plus代码生成器
  8. 工信部拟规定基本功能软件外的预置App均可卸载
  9. 手机网络游戏SDK集成指南
  10. outlook搜索栏跑到上面去了_南昌搜索引擎seo优化
  11. Supervisor 自动管理进程
  12. matlab-plot绘制点线图
  13. JTT808、JTT809、JTT796、JTT794、JTT1077、JTT1078区别与交通部道路运输车辆卫星定位系统部标标准大全下载地址...
  14. 氨基酸序列碎裂by离子-生物信息学笔记
  15. android 显示和风天气字体图标
  16. 自己开发iOS版按键精灵--TTouch
  17. windows/ps使用技巧
  18. shell脚本监控网站是否正常
  19. win7 桌面计算机不显示器,Win7电脑显示器模糊怎么办?
  20. 计算机术语桢什么意思,120桢什么意思

热门文章

  1. 微信向下滑动怎么传参服务器,微信小程序 - 传参的几种方式
  2. python 之 *args 和 **kwargs的区别
  3. 接入顶象技术小程序验证码全过程
  4. 支持多个git服务器的ssh配置方法及ssh config配置解释以及ssh-agent简单介绍
  5. entainment
  6. android拷贝喜马拉雅节目到music目录
  7. jpg转换成pdf应该怎么做
  8. 7zip linux 使用方法,Linux中的压缩软件7-zip的使用教程
  9. 81章 老子1章到_【图片】《道德经》读书笔记(希望从第1章到81章善始善终)【老子吧】_百度贴吧...
  10. Oracle安装 配置 使用 方法总结