首页 > 其他分享 >Qt QTreeView实现三态复选框

Qt QTreeView实现三态复选框

时间:2023-07-25 17:22:53浏览次数:36  
标签:Qt QTreeView int 复选框 item arg true QStandardItem

//参考:https://dgrt.cn/a/1328707.html?action=onClick

void QtWidgetsApplication1::initTreeView()
{
ui.treeView->setEditTriggers(QTreeView::NoEditTriggers);
//自定义右键菜单
this->setContextMenuPolicy(Qt::CustomContextMenu);
//最喜欢用的model, 不喜欢自己写model浪费时间
_model = new QStandardItemModel(this);
//隐藏头部
ui.treeView->setHeaderHidden(true);
//水平头部描述(已经被隐藏了)
QStringList headList;
headList << "item";
_model->setHorizontalHeaderLabels(headList);
_model->setColumnCount(headList.size());
auto root = new QStandardItem(QString("Root"));
root->setCheckable(true);
_model->appendRow(root);
for (int i = 0; i < 20; ++i) {
auto item = new QStandardItem(QString("%1").arg(i));
item->setCheckable(true);
int cRowCount = 2;/*rand() %300;*/
for (int j = 0; j < cRowCount; ++j) {
auto cItem = new QStandardItem(QString("[%1:%2]").arg(i).arg(j));
cItem->setCheckable(true);
item->appendRow(cItem);
for (int n = 0; n < 4; ++n) {
auto nItem = new QStandardItem(QString("[%1:%2]:[%3]").arg(i).arg(j).arg(n));
nItem->setCheckable(true);
cItem->appendRow(nItem);
for (int m = 0; m < 4; ++m) {
auto mItem = new QStandardItem(QString("[%1:%2]:[%3][%4]").arg(i).arg(j).arg(n).arg(m));
mItem->setCheckable(true);
nItem->appendRow(mItem);
}
}
}
item->setText(QString("%1 (%2)").arg(item->text()).arg(item->rowCount()));
root->appendRow(item);
//_model->appendRow(item);
}
connect(_model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(slotItemChanged(QStandardItem*)));
ui.treeView->setModel(_model);
}

void QtWidgetsApplication1::slotItemChanged(QStandardItem* item)
{
if (!item)
return;
_model->blockSignals(true);
setChildItems(item, item->checkState() == Qt::Checked ? true : false);
setParentItems(item, item->checkState() == Qt::Checked ? true : false);
_model->blockSignals(false);
ui.treeView->viewport()->update();
}

bool QtWidgetsApplication1::setParentItems(QStandardItem* item, bool check)
{
if (!item || !item->parent()) return false;
QStandardItem* parentItem = item->parent();
int rowCount = parentItem->rowCount();
Qt::CheckState checkState = check ? Qt::Checked : Qt::Unchecked;
int checkedCount = 0;
int uncheckedCount = 0;
for (int i = 0; i < rowCount; ++i) {
QStandardItem* childItem = parentItem->child(i);
if (childItem->checkState() == Qt::Checked && check) {
++checkedCount;
}
else if (childItem->checkState() == Qt::Unchecked && !check) {
++uncheckedCount;
}
else {
checkState = Qt::PartiallyChecked;
break;
}
}
if (checkedCount != rowCount && uncheckedCount != rowCount) {
checkState = Qt::PartiallyChecked;
}
parentItem->setCheckState(checkState);
setParentItems(parentItem, check);
return true;
}

bool QtWidgetsApplication1::setChildItems(QStandardItem* item, bool check)
{
if (!item) return false;
item->setCheckState(check ? Qt::Checked : Qt::Unchecked);
int rowCount = item->rowCount();
for (int i = 0; i < rowCount; ++i) {
QStandardItem* childItem = item->child(i);
setChildItems(childItem, check);
}
return true;
}
//启用/禁用 item及子项
bool QtWidgetsApplication1::setChildItemsEnabled(QStandardItem* item, bool enabled)
{
if (!item) return false;
item->setEnabled(enabled);
int rowCount = item->rowCount();
for (int i = 0; i < rowCount; ++i) {
QStandardItem* childItem = item->child(i);
setChildItemsEnabled(childItem, enabled);
}
return true;
}

标签:Qt,QTreeView,int,复选框,item,arg,true,QStandardItem
From: https://www.cnblogs.com/kinglxg/p/17580353.html

相关文章

  • Zabbix MQQT协议监控 loT设备
    一.项目背景监控异地局域网主机(主机内有物联5G卡可以单方面向特定的云服务器传输信息)这里采用zabbix5xx系列agent2-6.2版本主动模式,即客户端向服务端注册。 二.部署服务端 2.1安装docker#01安装docker#step1:安装必要的一些系统工具sudoyuminstall-y......
  • qt+opencv安装时的问题
    1、qt安装时可能无法启动,原因是缺少依赖项,执行以下指令:sudo apt-get install libxcb-xinerama0 2、qt运行时报错:GL/gl.h: No such file or directory。执行以下指令:sudo apt install mesa-common-devsudo apt install libgl1-mesa-dev 3、OpenCV编译时在执......
  • Qt打开文件夹
    QStringdirPath=QFileInfo(filepath).dir().path();//文件所在文件夹路径dirPath.replace("/","\\");//win系统下/替换成\。QProcessprocess;//启动一个program程序用后面的参数。//第一个参数是programQString类型,第二个参数是QStringList类型p......
  • QT从入门到实战完整版 P38
    手动调用绘图事件widget.h#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>QT_BEGIN_NAMESPACEnamespaceUi{classWidget;}QT_END_NAMESPACEclassWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parent=nullptr);~Widget();......
  • Qt mingw73_32 + MySql8.0 使用和对数据库操作 - 初窥篇1
    1、开发环境QtCreator4.8.2+Qt5.12.2+MySql8.0.332、设计背景现在已经有MySql8.0.33是64位的数据库,仅支持64位的程序,但是当前Qt程序编译环境是mingw73_3232位程序连接64位的数据库实例3、操作流程1)测试驱动代码+测试结果intmain(inta......
  • 通信猫 共享MQTT服务器 在线客户端连接失败
    解决方法使用官方mqtt链接工具(只支持TCP协议)需要有vs2013的dll文件支持,下载连接__官方下载链接,引用自http://www.tongxinmao.com/txm/webmqtt.php正常使用ws协议端口18832连接,控制台输出如下:使用WS协议连接ws协议端口18832,链接失败使用页面客户端工具连接TCP,查看控......
  • Qt Cannot retrieve debugging output报错 (无法获取调试输出.)
    我们在QT中有时会遇到Cannotretrievedebuggingoutput报错,无法利用qDebug输出内容,原因是开了两个qt软件,这是需要我们把其中一个qt软件关了,然后在唯一的qt中打开项目,放心,一个窗口仍然可以运行两个程序。 ......
  • c#学习笔记,实现物联网MQTT通信
    一、什么是MQTT MQTT协议由于其用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务,具有开销低、占用带宽低、即时通讯等优点,使其在物联网、小型设备、移动应用等方面有较广泛的应用,在工业物联网中,MQTT也有广泛的应用。主要有以下特点:使用发布/订阅消息模式,提供......
  • VS 如何用Qt 数据可视化
    VS如何用Qt数据可视化引言在软件开发过程中,数据可视化是非常重要的一环。通过数据可视化,我们可以更直观地展示数据,从而更好地理解和分析数据。Qt是一个功能强大的跨平台开发框架,它提供了丰富的图形绘制和数据可视化工具,可以帮助我们轻松实现各种形式的数据可视化。本文将介绍如......
  • .netmqtt库
    实现“.netmqtt库”教程作为一名经验丰富的开发者,我将带领你学习如何实现".netmqtt库"。在开始之前,让我们先了解整个实现过程的步骤。下面的表格将展示这些步骤。步骤描述步骤1安装.MQTT库步骤2创建MQTT客户端步骤3连接到MQTT代理步骤4发布消息步骤5订......