QTableWidget表头添加全选框

前言

QTableWidget表头不能直接设置复选框,setCheckState不适用,所以直接使用设置图片的方法最方便快捷,准备两个图片,分别为选中状态未选中状态

1.设置复选框列

设置第一列为复选框列,其他列正常显示内容:

for (int j = 0; j < table_head.size(); ++j)
{if (j == 0)//全选列 {//不直接设置setCellWidget为QCheckBox,使用布局再添加可使复选框居中QCheckBox *pCheckBox = new QCheckBox();pCheckBox->setCheckState(Qt::Unchecked);QWidget *pWgt = new QWidget;QVBoxLayout *pLayout = new QVBoxLayout;pLayout->addWidget(pCheckBox);pWgt->setLayout(pLayout);//设置margin,使复选框列窄一点,默认宽度比较大pCheckBox->setContentsMargins(0, 0, 0, 0);pLayout->setMargin(2);tableWidget->setCellWidget(i, j, pWgt);}else {QTableWidgetItem * pItem;pItem = new QTableWidgetItem;pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);pItem->setTextAlignment(Qt::AlignCenter);tableWidget->setItem(i, j, pItem);tableWidget->setText("abc");}
}

 2.设置表头图片与样式

直接添加Icon,默认会紧贴表格的左侧,并不居中,非常不好看。

所以使用setStyleSheet设置表头样式,如果使用QHeaderView::section是默认对所以表头设置样式,所以在设置样式时使用QHeaderView::section:first,只设置第一列左边距为6,这是我测试出比较合适的宽度。

设置表头全选框图片时,仍然可以拖动列宽,我不希望第一列可以拖动,因为没有意义,所以设置horizontalHeaderQHeaderView::Fixed模式,不允许拖动列宽。

这样就是比较美观的表格了。

//添加全选
tableWidget->horizontalHeaderItem(0)->setIcon(QIcon(":/Resources/res/icon/uncheck.png"));
//表头第一列图片左边距设置为6
tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section:first { padding-left: 6px; }");
tableWidget->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
//设置第一列不能拖动,为固定宽度
tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);

3.全选响应事件

对表头进行点击事件响应,使用sectionClicked信号。

connect(tableWidget->horizontalHeader(), &QHeaderView::sectionClicked, this, & Test::slot_onHeaderClicked);
void Test::slot_onHeaderClicked(int logicalIndex)
{if (logicalIndex != 0){return;}QString strText = tableWidget->horizontalHeaderItem(0)->text();//m_bChecked用来对表头全选图片进行设置if (!m_bChecked){m_bChecked = true;tableWidget->horizontalHeaderItem(0)->setIcon(QIcon(":/Resources/res/icon/checked.png"));}else{m_bChecked = false;tableWidget->horizontalHeaderItem(0)->setIcon(QIcon(":/Resources/res/icon/uncheck.png"));}//全选int nRow = tableWidget->rowCount();for (int i = 0; i < nRow; i++){QCheckBox *pCheckBox = getCheckBox(i);//获取第一列中的复选框if (pCheckBox == nullptr){continue;}if (m_bChecked){pCheckBox->setChecked(true);}else{pCheckBox->setChecked(false);}}}

4.第一列选择框,勾选响应事件

需求:

(1)单选时,当前列多选框勾选

(2)鼠标左键按下时拖拽,可选多行

设置表格为多选模式:

tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);

实现的信号:

connect(tableWidget, &QTableWidget::itemSelectionChanged, this, &Test::slot_checkStates);

实现:

void Test::slot_checkStates()
{int curiRow = tableWidget->currentRow();//获取勾选框QCheckBox *pCheckBox = getCellCheckBox(curiRow);if (pCheckBox == nullptr){return;}if (pCheckBox->isChecked())pCheckBox->setChecked(false);elsepCheckBox->setChecked(false);tableWidget->horizontalHeaderItem(0)->setIcon(QIcon(":/Resources/res/icon//uncheck.png"));m_bChecked = false;QList<QTableWidgetItem*> lstSelectedItems = tableWidget->selectedItems();QList<int> lstSelectedRow;for (int i = 0; i < lstSelectedItems.size(); i++){if (lstSelectedItems.at(i) == nullptr){continue;}int nRow = lstSelectedItems.at(i)->row();if (!lstSelectedRow.contains(nRow)){lstSelectedRow << nRow;}}for (int m = 0; m < tableWidget->rowCount(); m++){QCheckBox *pTmpCheckBox = getCellCheckBox(m);if (pTmpCheckBox == nullptr){continue;}//设置选中,异或,只符合一个条件才行if ((lstSelectedRow.size() > 0 && lstSelectedRow.contains(m)) ^ (lstSelectedRow.size() == 0 && m == curiRow)){pTmpCheckBox->setChecked(true);continue;}pTmpCheckBox->setChecked(false);}
}

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

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

相关文章

大模型实战:RAG的应用探索

自chatgpt卷过来&#xff0c;我们‘打开’了视野&#xff0c;发现‘什么都想要’成为了可能。但是随着国内开源大模型的开放&#xff0c;越来越多人觉得通用LLM的价值很低&#xff08;可能是商业利益的驱使&#xff09;。大家对技术的追逐有变成了应用变现的需求。好吧&#xf…

日常的网络杂记

网络杂记 vlan 交换机配到一个vlan下面就可以互通&#xff0c;用来做物理上的网段隔离可以 ①access模式只能承载一个vlan的流量。如果两个交换机上只有一个vlan&#xff0c;那么两个交换机之间肯定能通信。 ②即使两个交换机上有2个或2个以上的valn&#xff0c;但你把交换机…

Windows 11文件资源管理器选项卡的4个高级用法,肯定有你喜欢的

作为一个每天使用文件资源管理器来管理我的工作流程的人,选项卡帮助我为处于不同完成阶段的工作创建了不同的文件夹。以下是我使用选项卡提高工作效率的最佳技巧。 打开和关闭选项卡 假设你的计算机上安装了Windows 11的最新更新,请按Ctrl+E打开文件资源管理器。在我发现“…

WordPress的性能优化有哪些方法?

WordPress的性能优化方法主要包括以下几个方面&#xff1a; 1. 使用缓存插件&#xff1a;缓存插件可以降低服务器负载&#xff0c;提高网站加载速度。常用的缓存插件有WP Rocket、WP Fastest Cache和Cache Enabler等。 2. 代码压缩和整合&#xff1a;通过压缩JavaScript、CSS…

可验证算法在招投标领域的专家“盲抽”中的标段识别码加密应用研究

摘要 在招投标过程中&#xff0c;标段&#xff08;包&#xff09;识别码的安全性至关重要。本文提出了一种基于可验证算法的标段识别码加密方法&#xff0c;以确保其在专家“盲抽”过程中的保密性和可信性。通过对不同表的标段识别码进行全量加密&#xff0c;并通过匹配验证其…

烟草企业如何在数字化转型中实现从“传统”到“智能”的跨越?

在数字化浪潮的席卷下&#xff0c;各行各业都在经历着深刻的变革。作为国民经济的重要组成部分&#xff0c;烟草行业正处于高质量发展的重要阶段&#xff0c;加快信息系统国产化升级&#xff0c;对于提升行业竞争力、强化信息安全保障具有重要战略意义。 达梦数据积极助力烟草行…

FPGA_GTX:简要版

1. GTX介绍 Xilinx FPGA的GT意思是Gigabyte Transceiver。通常称呼为Serdes、高速收发器。GT在xilinx不同系列有着不同的产品&#xff0c;从7系列到UltraScale系列分别有GTP、GTX、GTZ、GTH、GTY和GTM。不同GT整体结构上类似&#xff0c;为了支持越来越高的line rate&#xff…

PostgreSQL主从复制:打造高可用数据库架构的秘籍

PostgreSQL主从复制&#xff1a;打造高可用数据库架构的秘籍 在当今的数字化时代&#xff0c;数据的安全性和可靠性是企业最为关注的问题之一。PostgreSQL作为一种强大的开源关系型数据库管理系统&#xff0c;提供了多种高可用性解决方案&#xff0c;其中主从复制是最为常用的…

嵌入式Linux系统编程 — 7.2 进程的环境变量

目录 1 什么是进程的环境变量 2 环境变量的作用 3 应用程序中获取环境变量 3.1 environ全局变量 3.2 获取指定环境变量 getenv 4 添加/删除/修改环境变量 4.1 putenv()函数添加环境变量 4.2 setenv()函数 4.3 unsetenv()函数 1 什么是进程的环境变量 每一个进程都有一…

Android触摸事件分发关键点【笔记摘要】

触摸事件分发&#xff1a;就是一个为了解决触摸事件冲突而设置的机制 1.事件类型 ACTION_DOWN -> ACTION_UP / ACTION_CANCEL ACTION_DOWN -> ACTION_MOVE -> ACTION_MOVE -> ACTION_MOVE -> ACTION_UP / ACTION_CANCEL 这个取消事件ACTION_CANCEL它是一种特殊…

Hack The Box -- Blazorized

一、准备工作 端口扫描 详细扫描 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-30 21:39 EDT Nmap scan report for 10.10.11.22 Host is up (0.26s latency).PORT STATE SERVICE VERSION 53/tcp open domain Simple DNS Plus 80/tcp op…

Java后端开发(十三)-- Java8 stream的 orElse(null) 和 orElseGet(null)

orElse(null)表示如果一个都没找到返回null。【orElse()中可以塞默认值。如果找不到就会返回orElse中你自己设置的默认值。】 orElseGet(null)表示如果一个都没找到返回null。【orElseGet()中可以塞默认值。如果找不到就会返回orElseGet中你自己设置的默认值。】 区别就…

MyBatisPlus Service接口的继承

介绍 Service接口 接口基础了接口 IService&#xff0c;实现类实现就需要实现IService里的方法&#xff0c;但是MyBatisplus已经帮我们写好了实现类&#xff0c;给我们的实现类继承即可。 public interface IEmpService extends IService<Emp> { //其他业务方法.... }…

web学习笔记(八十)

目录 1.小程序实现微信一键登录 2. 小程序的授权流程 3.小程序配置vant库 4.小程序配置分包 5.小程序配置独立分包 6.小程序分包预下载 1.小程序实现微信一键登录 要先实现小程序一键登录首先我们需要给按钮设置一个绑定事件&#xff0c;然后在绑定事件内部通过wx.login…

产品经理-工作流程及职能(6)

产品经理作为互联网项目的主心骨&#xff0c;连接着团队的所有成员&#xff08;开发、设计、运营、测试、市场等&#xff09; 用合理的产品规划和清晰的产品愿景带领大家前进&#xff0c;通过满足用户需求来创造属于自己的商业利益。 在通常情况下&#xff0c;PM需要对整个产品…

大数据前沿技术分享——数据编织:现代数据管理的革命性方法

一、什么是数据编织&#xff1f; 数据编织&#xff08;Data Fabric&#xff09;是一种现代数据管理架构&#xff0c;旨在通过集成、管理和提供数据访问来简化复杂的数据环境。它利用自动化和智能技术&#xff0c;如机器学习和人工智能&#xff0c;来实现数据的无缝连接和统一视…

Yarn: 现代化的JavaScript包管理器

在JavaScript开发的世界里&#xff0c;包管理器是开发者不可或缺的工具。Yarn&#xff0c;由Facebook创建&#xff0c;是一个快速、可靠且安全的依赖管理工具&#xff0c;它为JavaScript应用程序提供了一个更高效的方式来处理包的安装、更新和版本控制。本文将介绍Yarn的基本用…

刷题Day44|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

188.买卖股票的最佳时机IV 188. 买卖股票的最佳时机 IV - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;最多买卖k次&#xff0c;每次都有持有和不持有&#xff0c;所以下标最大到dp[i][2k]。 309.最佳买卖股票时机含冷冻期 309. 买卖股票的最佳时机含冷冻期 - 力…

百度智能云创新业务部总经理李想:发挥AI企业科技创新优势 助力职业教育人才扬帆远航

前言&#xff1a;百度智能云教育行业解决方案作为百度智能云旗下的创新力量&#xff0c;专注于培养“AI教育”领域的新质生产力人才&#xff0c;一直以来备受职业教育领域的关注。在第六届人工智能“职教百强”院校长论坛开幕之际&#xff0c;中教全媒体对话论坛嘉宾百度智能云…

最新扣子(Coze)实战案例:使用图像流做超分,模糊图片秒变清晰,完全免费教程

&#x1f9d9;‍♂️ 大家好&#xff0c;我是斜杠君&#xff0c;手把手教你搭建扣子AI应用。 &#x1f4dc; 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》&#xff0c;完全免费学习。 &#x1f440; 关注斜杠君&#xff0c;可获取完整版教程。&#x1f44d;&#x1f3f…