QHeaderView添加复选框以及样式

实现这个效果,需要重写`paintSection`来实现效果,同时重写`mousePressEvent`来执行是否勾选复选框。

paintSection实现一些复选框样式

void CheckBoxHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{if (m_logicalIndex.contains(logicalIndex)){painter->save();QHeaderView::paintSection(painter, rect, logicalIndex);painter->restore();QStyleOptionButton checkBoxOption;QRect checkBoxRect = style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkBoxOption);checkBoxOption.rect = rect;checkBoxOption.rect.setLeft(rect.left() + (rect.width() - checkBoxRect.width()) / 2);checkBoxOption.rect.setTop(rect.top() + (rect.height() - checkBoxRect.height()) / 2);checkBoxOption.state = m_logicalIndex.value(logicalIndex) ? QStyle::State_On :QStyle::State_Off;checkBoxOption.state |= QStyle::State_Enabled;QCheckBox checkBox;checkBox.setStyleSheet(m_strStyleSheet);checkBox.style()->drawControl(QStyle::CE_CheckBox, &checkBoxOption, painter, &checkBox);//style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkBoxOption, painter,&checkBox);}else{QHeaderView::paintSection(painter, rect, logicalIndex);}
}

或者通过QWidget的render()来实现

void CheckBoxHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{if (m_logicalIndex.contains(logicalIndex)){painter->save();QHeaderView::paintSection(painter, rect, logicalIndex);painter->restore();QStyleOptionButton checkBoxOption;QRect checkBoxRect = style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkBoxOption);int x = rect.left() + (rect.width() - checkBoxRect.width()) / 2;int y = rect.top() + (rect.height() - checkBoxRect.height()) / 2;QCheckBox checkBox;checkBox.setCheckState(m_logicalIndex.value(logicalIndex) ?Qt::Checked:Qt::Unchecked);checkBox.setStyleSheet(m_strStyleSheet);checkBox.setGeometry(checkBoxRect);painter->save();painter->translate(x, y);checkBox.render(painter);painter->restore();}else{QHeaderView::paintSection(painter, rect, logicalIndex);}
}

 

mousePressEvent实现点击时是否勾选复选框

void CheckBoxHeaderView::mousePressEvent(QMouseEvent *event)
{if (!(event->buttons() & Qt::LeftButton)){QHeaderView::mousePressEvent(event);return ;}int idx = this->logicalIndexAt(event->pos());if (!m_logicalIndex.contains(idx)){QHeaderView::mousePressEvent(event);return ;}m_logicalIndex[idx] = !m_logicalIndex[idx];viewport()->update();emit stateChanged(m_logicalIndex[idx], idx);return;
}

 为了能够更好的设置QHeaderView中某个单元格是否拥有复选框功能,所以添加以下这些操作。

QHash<int,bool> m_logicalIndex;
signals:void stateChanged(bool bChecked, int index);void CheckBoxHeaderView::setCheckable(QList<int> allIndex)
{bool bUpdate = false;for (int i=0; i<allIndex.size(); ++i){int id = allIndex.at(i);if (!m_logicalIndex.contains(id)){m_logicalIndex[id] = false;bUpdate = true;}}if (bUpdate){viewport()->update();}
}void CheckBoxHeaderView::setCheckable(int idx)
{if (!m_logicalIndex.contains(idx)){m_logicalIndex[idx] = false;viewport()->update();}
}void CheckBoxHeaderView::setUncheckable(QList<int> allIndex)
{bool bUpdate = false;for (int i=0; i<allIndex.size(); ++i){int id = allIndex.at(i);if (m_logicalIndex.contains(id)){m_logicalIndex.remove(id);bUpdate = true;}}if (bUpdate){viewport()->update();}
}void CheckBoxHeaderView::setUncheckable(int idx)
{if (m_logicalIndex.contains(idx)){m_logicalIndex.remove(idx);viewport()->update();}
}void CheckBoxHeaderView::setChecked(bool check, int idx)
{if (m_logicalIndex.contains(idx)){if (m_logicalIndex[idx] != check){m_logicalIndex[idx] = check;viewport()->update();}}
}bool CheckBoxHeaderView::isChecked(int idx) const
{if (m_logicalIndex.contains(idx)) {return m_logicalIndex[idx];}return false;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 原生开发与Harmony原生开发浅析

Android系统 基于Linux ,架构如下 底层 (Linux )> Native ( C层) > FrameWork层 (SystemService) > 系统应用 (闹钟/日历等) 从Android发版1.0开始到现在15,经历了大大小小的变革 从Android6.0以下是个分水岭,6.0之前权限都是直接卸载Manifest中配置 6.0开始 则分普…

Matlab|基于氢储能的热电联供型微电网优化调度方法

目录 1 主要内容 模型求解流程 2 部分程序 3 程序结果 日前调度 日内调度 4 下载链接 1 主要内容 该程序复现《基于氢储能的热电联供型微电网优化调度方法》&#xff0c;针对质子交换膜燃料电池和电解槽的热电联供特性&#xff0c;为避免氢能系统的热能浪费并进一步提高…

k8s 综合项目笔记

综述 这篇笔记主要是为了记录下自己写 k8s 综合项目的过程。 由于自己之前已经写过简单的开发和运维项目&#xff0c;所以这里就结合一下&#xff0c;在搭建 k8s 集群后安装运维常用服务&#xff0c;比如 ansible 和 prometheus&#xff0c;用 NFS 实现数据存储同步&#xff0c…

Windwos下Docker下载安装centos7.6

操作步骤&#xff1a; 1.打开docker软件进入到DockerHub页面搜索contos镜像 2.在终端通过命令获取镜像并创建容器运行 docker run -itd --name test_centos7.6 centos:7.6.1810 test_centos7.6表示容器的名称 centos:7.6.1810表示镜像的名称&#xff0c;如果镜像不存在会默认拉…

k8s 部署 emqx

安装cert-manager 使用Helm安装 helm repo add jetstack https://charts.jetstack.io helm repo update helm upgrade --install cert-manager jetstack/cert-manager \--namespace cert-manager \--create-namespace \--set installCRDstrue如果通过helm命令安装失败&#x…

网络层知识点总结4

目录 前言 一、什么是NAT&#xff1f;什么是NAPT&#xff1f;NAT的优点和缺点有哪些&#xff1f;NAPT有哪些特点&#xff1f; 二、建议IPv6协议没有首部检验和。这样做的优缺点是什么&#xff1f; 三、当使用IPv6时&#xff0c;协议ARP是否需要改变&#xff1f;如果需要改变…

线性可分支持向量机代码 举例说明 具体的变量数值变化

### 实现线性可分支持向量机 ### 硬间隔最大化策略 class Hard_Margin_SVM:### 线性可分支持向量机拟合方法def fit(self, X, y):# 训练样本数和特征数m, n X.shape# 初始化二次规划相关变量&#xff1a;P/q/G/hself.P matrix(np.identity(n 1, dtypenp.float))self.q matr…

ArcGIS计算多个面要素范围内栅格数据各数值的面积

本文介绍在ArcMap软件中&#xff0c;基于面积制表工具&#xff08;也就是Tabulate Area工具&#xff09;&#xff0c;基于1个面要素数据集与1个栅格数据&#xff0c;计算每一个面要素中各栅格数据分布面积的方法。 首先&#xff0c;来看一下本文的需求。现有一个矢量面的要素集…

Springboot整合原生ES依赖

前言 Springboot整合依赖大概有三种方式&#xff1a; es原生依赖&#xff1a;elasticsearch-rest-high-level-clientSpring Data ElasticsearchEasy-es 三者的区别 1. Elasticsearch Rest High Level Client 简介: 这是官方提供的 Elasticsearch 客户端&#xff0c;支持…

小问题解决方法汇总(2024.10.24水个勋章)

问题1&#xff1a;”因为在系统上禁止运行脚本“ 我们在使用命令行时经常遇到类似文章这样的提示&#xff0c;或者是如下截图中显示的那样&#xff1a; 仅需要在“管理员权限下的Powershell”中输入下面的命令即可解决&#xff1a; set-ExecutionPolicy RemoteSigned 输入命…

【数据分享】全国科技-产品质量国家监督抽查(1995-2021年)

数据介绍 一级标题指标名称单位科技国家监督抽查产品种类种科技国家监督抽查食品种类种科技国家监督抽查日用消费品种类种科技国家监督抽查建筑与装饰装修材料种类种科技国家监督抽查农业生产资料种类种科技国家监督抽查工业生产资料种类种科技国家监督抽查企业家科技国家监督抽…

Dns_在Ubuntu和Centos上安装并配置Dns服务器

Dns_在Ubuntu和Centos上安装并配置Dns服务器 一、Ubuntu上安装Dns1.安装 BIND92.配置 DNS 服务器3.配置防火墙&#xff08;如果启用 UFW&#xff09;4.在客户端使用 DNS 服务器5.测试 DNS 服务器6.常见问题及解决方案 二、Centos上安装Dns 以下记录在Ubuntu和Centos系统上安装D…

软工毕设开题建议

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 深度学习社…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器&#xff08;做梦&#xff09;&#xff0c;你的导师让你学习部署并且训练不同尺寸的大模型&#xff0c;并且写一个说明文档。你意识到&#xff0c;你最需要学习的就是关于分布式训练的知识&#xff0c;因为你可是第一次接触这么多卡…

聚合值和非聚合值比较【SQL】

文章目录 聚合值和非聚合值比较背景可以在HAVING中使用的聚合条件如何实现与非聚合值的比较与非聚合值的特殊比较 聚合值和非聚合值比较 背景 在数据库中&#xff0c;聚合值和非聚合值通常不直接比较&#xff0c;因为它们的上下文和用途不同。聚合值是通过聚合函数计算出来的…

linx ,centos7 ,hadoop集群登录时免密登录注意点以及步骤

linx ,centos7 ,hadoop集群登录时免密登录注意点以及步骤 SSH 免密登陆 1&#xff0c;在配置ssh免密登陆之前&#xff0c;将master克隆3份slaves出来&#xff0c;然后验证其ip是否和上面所述一致&#xff0c;并使用Xshell连接&#xff0c;这样我们可以得到额外的三台机器&…

【数据仓库】数据仓库面试题

简单整理了一下题目和答案&#xff0c;希望对大家有所帮助。 第一面&#xff1a;基础技术与概念 什么是ETL&#xff1f;请解释ETL过程中的每个步骤。 ETL是Extract, Transform, Load的缩写&#xff0c;用于描述将数据从源系统提取、转换为适合分析的形式、最后加载到目标系统的…

使用vscode拉取release远程分支,发现没有这个分支,但是远程仓库里确确实实有,是因为没有及时更新远程仓库分支导致

今天在开发过程中&#xff0c;需要从release分支上拉取代码重新拉个分支开发&#xff0c;方便后面迭代更新。但是我在vscode里点击分支&#xff0c;发现没有远程分支release/v1.0.0&#xff0c;但是仓库里确确实实有这个分支。然后我就上网查有类似的情况&#xff0c;参考别人是…

ANSI C、ISO C、POSIX标准、GNU的含义

一、基本概念 ISO: International Organization for Standardization&#xff0c;国际标准组织 ANSI: American National Standards Institute&#xff0c;美国国家标准协会 GNU&#xff1a;GNUs Not Unix&#xff0c;为了实现自由开源目的一个基金会 POSIX: Portable Oper…

74页PPT智能工厂整体规划方案

▲关注智慧方案文库&#xff0c;学习9000多份最新解决方案&#xff0c;其中 PPT、WORD超过7000多份 &#xff0c;覆盖智慧城市多数领域的深度知识社区&#xff0c;稳定更新4年&#xff0c;日积月累&#xff0c;更懂行业需求。 智能工厂的定义 根据《智能工厂通用技术要求》的…