QTableView复选框居中

目录

  • 方法一:QSS
  • 方法2:自定义复选框委托类
      • 一、构造函数 `CheckBoxDelegate()`
      • 二、`paint()` 方法
      • 三、`editorEvent()` 方法
      • 四、关键设计要点
      • 五、扩展应用场景
      • 六、代码示例(补充)

方法一:QSS

QTableView::indicator {position: relative;  /* 相对定位 */left: 50%;           /* 左边线定位到父容器中心 */
}

缺点:需要计算向右移动一定距离的left

position和left的QSS解释
在这里插入图片描述

方法2:自定义复选框委托类


#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QPainter>
#include <QStyleOptionButton>
#include <QMouseEvent>// 自定义复选框委托类
// 功能:实现在 QTableView 中居中显示复选框,并支持点击交互,结合原样式
class CheckBoxDelegate : public QStyledItemDelegate {
public:// 构造函数explicit CheckBoxDelegate(QObject* parent = nullptr): QStyledItemDelegate(parent) {} // 继承基类构造函数// 重写绘制方法void paint(QPainter* painter,const QStyleOptionViewItem& option,const QModelIndex& index) const override{// 检查当前项是否支持勾选(Qt::ItemIsUserCheckable 标志)if (index.flags() & Qt::ItemIsUserCheckable){// --- 步骤 1: 准备绘制参数 ---QStyleOptionButton checkOption; // 创建复选框的样式选项checkOption.rect = option.rect; // 初始矩形区域设为单元格区域checkOption.state = option.state; // 继承基础状态(如启用、激活状态)// 获取当前项的勾选状态Qt::CheckState checkState = static_cast<Qt::CheckState>(index.data(Qt::CheckStateRole).toInt());// 根据状态设置 QStyle 标志if (checkState == Qt::Checked) {checkOption.state |= QStyle::State_On; // 选中状态}else {checkOption.state |= QStyle::State_Off; // 未选中状态}// --- 步骤 2: 计算居中位置 ---// 获取标准复选框指示器的默认尺寸(例如 16x16)QRect checkRect = option.widget->style()->subElementRect(QStyle::SE_CheckBoxIndicator, // 获取复选框指示器区域&checkOption,                 // 传入样式选项option.widget                 // 关联的控件(用于样式计算));// 将复选框矩形中心对齐到单元格中心checkRect.moveCenter(option.rect.center());checkOption.rect = checkRect; // 更新样式选项中的矩形区域// --- 步骤 3: 绘制复选框 ---// 使用当前控件的样式绘制复选框option.widget->style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, // 绘制复选框基本元素&checkOption,                 // 样式选项painter,                     // 画布option.widget                // 关联的控件(用于样式适配));}else{// 对于非勾选项,调用基类默认绘制方法(例如文本、背景等)QStyledItemDelegate::paint(painter, option, index);}}// 重写事件处理方法(实现点击交互)bool editorEvent(QEvent* event,QAbstractItemModel* model,const QStyleOptionViewItem& option,const QModelIndex& index) override{// 只处理鼠标释放事件(点击完成时触发)if (event->type() == QEvent::MouseButtonRelease){QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);// --- 步骤 1: 计算复选框的实际点击区域 ---QStyleOptionButton checkOption;checkOption.rect = option.rect; // 初始区域为单元格区域// 获取标准复选框指示器的矩形(与绘制时计算方式一致)QRect checkRect = option.widget->style()->subElementRect(QStyle::SE_CheckBoxIndicator,&checkOption,option.widget);// 将矩形中心对齐到单元格中心(确保与绘制的区域一致)checkRect.moveCenter(option.rect.center());// --- 步骤 2: 判断点击是否在复选框区域内 ---if (checkRect.contains(mouseEvent->pos())){// 获取当前勾选状态Qt::CheckState currentState = static_cast<Qt::CheckState>(index.data(Qt::CheckStateRole).toInt());// 切换状态(Checked <-> Unchecked)Qt::CheckState newState = (currentState == Qt::Checked)? Qt::Unchecked: Qt::Checked;// 更新模型数据(触发视图刷新)model->setData(index, newState, Qt::CheckStateRole);return true; // 事件已处理,不再传递}}// 其他事件交由基类处理(例如键盘事件、未点击复选框区域的鼠标事件)return QStyledItemDelegate::editorEvent(event, model, option, index);}
};

在这里插入图片描述

在 Qt 的 QTableView 中,通过自定义委托类 CheckBoxDelegate 实现复选框居中显示和交互功能,其核心逻辑集中在 paint()editorEvent() 方法中。


一、构造函数 CheckBoxDelegate()

功能
继承自 QStyledItemDelegate 并初始化父类,为后续的委托操作提供基础支持。
代码解析

explicit CheckBoxDelegate(QObject* parent = nullptr): QStyledItemDelegate(parent) {}
  • 作用:通过基类构造函数传递父对象指针,确保委托与视图控件的生命周期绑定。

二、paint() 方法

核心功能
负责绘制居中显示的复选框,并根据模型数据状态(选中/未选中)更新样式。
关键步骤解析

  1. 检查可勾选性
    通过 index.flags() & Qt::ItemIsUserCheckable 判断当前项是否支持勾选,避免对非勾选项误操作。

  2. 准备绘制参数

    • 样式选项初始化:创建 QStyleOptionButton 对象,继承视图的基础状态(如控件是否启用)。
    • 状态设置:根据模型的 Qt::CheckStateRole 数据设置 QStyle::State_On(选中)或 QStyle::State_Off(未选中)标志。
  3. 计算居中位置

    QRect checkRect = option.widget->style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkOption, option.widget
    );
    checkRect.moveCenter(option.rect.center());
    
    • 子元素矩形获取:通过 QStyle::SE_CheckBoxIndicator 获取默认复选框指示器的尺寸(如 16x16)。
    • 中心对齐:将矩形中心对齐到单元格中心,确保复选框居中。
  4. 绘制复选框
    调用 QStyle::drawPrimitive() 方法,使用当前控件的样式(如 Fusion、Windows 等)绘制复选框。


三、editorEvent() 方法

核心功能
处理鼠标点击事件,实现复选框状态的切换与模型数据更新。
关键步骤解析

  1. 事件类型过滤
    仅处理 QEvent::MouseButtonRelease 事件,确保在鼠标释放时触发状态切换。

  2. 点击区域计算

    QRect checkRect = option.widget->style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkOption, option.widget
    );
    checkRect.moveCenter(option.rect.center());
    
    • 与绘制逻辑一致:使用相同的子元素矩形计算方法,确保点击区域与绘制区域完全匹配。
  3. 状态切换与模型更新

    • 获取当前状态:从模型数据中读取 Qt::CheckStateRole 的值。
    • 状态取反:切换选中(Qt::Checked)与未选中(Qt::Unchecked)状态。
    • 更新模型:通过 model->setData() 修改数据,触发视图刷新。

四、关键设计要点

  1. 样式一致性
    使用 QStyle 绘制复选框,确保与当前系统或应用程序主题兼容。

  2. 交互精准性
    通过计算点击区域与绘制区域的一致性,避免误触或点击无效的问题。

  3. 性能优化

    • 避免重复计算:仅在需要时处理勾选项的绘制和事件。
    • 模型-视图分离:通过 setData() 更新模型,符合 Qt 的模型/视图架构。

五、扩展应用场景

  1. 三态复选框
    可扩展支持 Qt::PartiallyChecked 状态,用于树形表格的父子节点联动。

  2. 动态样式调整
    结合 QSS 修改复选框颜色、尺寸,或通过重写 sizeHint() 调整单元格大小。

  3. 键盘事件支持
    editorEvent() 中处理 QEvent::KeyPress,支持空格键切换复选框状态。


六、代码示例(补充)

// 在 QTableView 中应用委托
QTableView *tableView = new QTableView();
CheckBoxDelegate *delegate = new CheckBoxDelegate(tableView );
tableView->setItemDelegate(delegate);  // 对所有列生效

或者

// 在 QTableView 中应用委托
QTableView *tableView = new QTableView();
CheckBoxDelegate *delegate = new CheckBoxDelegate(tableView );
tableView->setItemDelegateForColumn(0, delegate);  // 对第 0 列生效

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

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

相关文章

基于QT的仿QQ音乐播放器

一、项目介绍 该项目是基于QT开发的⾳乐播放软件&#xff0c;界面友好&#xff0c;功能丰富&#xff0c;主要功能如下&#xff1a; 窗口hand部分&#xff1a; 点击最小化按钮&#xff0c;窗口最小化 点击最大化按钮&#xff0c;窗口最大化 点击关闭按钮&#xff0c;程序退出 …

SQL知识点合集---第二弹

数据一 <select id"listPositionAuditCheckSample" resultType"net.nxe.cloud.content.server.entity.PositionAuditCheckSample"><trim prefixOverrides"union all"><if test"userSampleCount ! null and userSampleCount…

【QT】QT控制硬件

QT控制硬件 1.上位机程序开发2.具体例子控制led灯3. linux中的函数跟QT类里面的函数同名&#xff0c;发生冲突4.示例代码 1.上位机程序开发 QT做一个上位机程序&#xff0c;控制底层的硬件设备(下位机) 总结&#xff1a; 在构造函数里面去初始化&#xff0c;打开硬件驱动在析…

Flutter介绍、Flutter Windows Android 环境搭建 真机调试

目录 Flutter介绍 Windows 环境搭建 1.安装配置JDK 2.下载安装Android Studio 3.下载配置Flutter SDK ​4.运行Flutter doctor命令检测环境是否配置成功 ​5.打开Android Studio安装Flutter/Dart 插件 ​6.插件运行Flutter项目 ​编辑 Flutter Android真机调试 Flut…

Android Studio 中使用 SQLite 数据库开发完整指南(Kotlin版本)

文章目录 1. 项目准备1.1 创建新项目1.2 添加必要依赖 2. 数据库设计3. 实现数据库3.1 创建实体类 (Entity)3.2 创建数据访问对象 (DAO)3.3 创建数据库类 4. 创建 Repository5. 创建 ViewModel6. 实现 UI 层6.1 创建笔记列表 Activityactivity_notes_list.xmlNotesListActivity…

Vue基础(7)_计算属性

计算属性(computed) 一、使用方式&#xff1a; 1.定义计算属性&#xff1a; 在Vue组件中&#xff0c;通过在 computed 对象中定义计算属性名称及对应的计算函数来创建计算属性。计算函数会返回计算属性的值。 2.在模板中使用计算属性&#xff1a; 在Vue的模板中&#xff0c;您…

辛格迪客户案例 | 华道生物细胞治疗生产及追溯项目(CGTS)

01 华道&#xff08;上海&#xff09;生物医药有限公司&#xff1a;细胞治疗领域的创新先锋 华道&#xff08;上海&#xff09;生物医药有限公司&#xff08;以下简称“华道生物”&#xff09;是一家专注于细胞治疗技术研发与应用的创新型企业&#xff0c;尤其在CAR-T细胞免疫…

[26] cuda 应用之 nppi 实现图像格式转换

[26] cuda 应用之 nppi 实现图像格式转换 讲述 nppi 接口定义通过nppi实现 bayer 格式转rgb格式官网参考信息:http://gwmodel.whu.edu.cn/docs/CUDA/npp/group__image__color__debayer.html#details1. 接口定义 官网关于转换的原理是这么写的: Grayscale Color Filter Array …

2025“钉耙编程”中国大学生算法设计春季联赛(8)10031007

题目的意思很好理解找从最左边到最右边最短路&#xff08;BFS&#xff09; #include <bits/stdc.h> using namespace std; int a[510][510]; // 存储网格中每个位置是否有障碍&#xff08;1表示有障碍&#xff0c;0表示无障碍&#xff09; int v[510][510]; // 记录每…

【Linux】第十一章 管理网络

目录 1.TCP/IP网络模型 物理层&#xff08;Physical&#xff09; 数据链路层&#xff08;Date Link&#xff09; 网络层&#xff08;Internet&#xff09; 传输层&#xff08;Transport&#xff09; 应用层&#xff08;Application&#xff09; 2. 对于 IPv4 地址&#…

python_股票月数据趋势判断

目录 前置 代码 视频&月数据 前置 1 A股月数据趋势大致判断&#xff0c;做一个粗略的筛选 2 逻辑&#xff1a; 1&#xff09;取最近一次历史最高点 2&#xff09;以1&#xff09;中最高点为分界点&#xff0c;只看右侧数据&#xff0c;取最近一次最低点 3&#xf…

Python PyAutoGUI库【GUI 自动化库】深度解析与实战指南

一、核心工作原理 底层驱动机制&#xff1a; 通过操作系统原生API模拟输入使用ctypes库调用Windows API/Mac Cocoa/Xlib屏幕操作依赖Pillow库进行图像处理 事件模拟流程&#xff1a; #mermaid-svg-1CGDRNzFNEffhvSa {font-family:"trebuchet ms",verdana,arial,sans…

Spring框架allow-bean-definition-overriding详细解释

Spring框架中&#xff0c;allow-bean-definition-overriding 是一个控制是否允许覆盖同名Bean定义的配置属性。以下是详细说明&#xff1a; ​1. 作用​ ​允许/禁止Bean定义覆盖​&#xff1a;当Spring容器中检测到多个同名的Bean定义时&#xff0c;此配置决定是否允许后续的…

机器人抓取位姿检测——GRCN训练及测试教程(Pytorch)

机器人抓取位姿检测——GRCN训练及测试教程(Pytorch) 这篇文章主要介绍了2020年IROS提出的一种名为GRCN的检测模型,给出了代码各部分的说明,并给出windows系统下可以直接复现的完整代码,包含Cornell数据集。 模型结构图 github源码地址:https://github.com/skumra/robo…

在web应用后端接入内容审核——以腾讯云音频审核为例(Go语言示例)

腾讯云对象存储数据万象&#xff08;Cloud Infinite&#xff0c;CI&#xff09;为用户提供图片、视频、语音、文本等文件的内容安全智能审核服务&#xff0c;帮助用户有效识别涉黄、违法违规和广告审核&#xff0c;规避运营风险。本文以音频审核为例给出go语言示例代码与相应结…

GraphRAG知识库概要设计展望

最近研究了一下GraphRAG&#xff0c;写了一个文档转换工具还有图可视化工具&#xff0c;结合langchain构建RAG经验&#xff0c;还有以前的数据平台&#xff0c;做了一个知识库概要设计&#xff0c;具体应用欢迎留言探讨。 一、GraphRAG整体概述 GraphRAG图基检索增强生成&…

Android Studio 日志系统详解

文章目录 一、Android 日志系统基础1. Log 类2. 日志级别 二、Android Studio 中的 Logcat1. 打开 Logcat2. Logcat 界面组成3. 常用 Logcat 命令 三、高级日志技巧1. 自定义日志工具类2. 打印方法调用栈3. 打印长日志4. JSON 和 XML 格式化输出 四、Logcat 高级功能1. 自定义日…

深度对比:Objective-C与Swift的RunTime机制与底层原理

1. RunTime简介 RunTime&#xff08;运行时&#xff09;是指程序在运行过程中动态管理类型、对象、方法等的机制。Objective-C 和 Swift 都拥有自己的运行时系统&#xff0c;但设计理念和实现方式有很大不同。理解 RunTime 的底层原理&#xff0c;是掌握 iOS 高级开发的关键。…

使用手机录制rosbag包

文章目录 简介录制工具录制步骤录制设置设置IMU录制频率设置相机分辨率拍照模式录制模式数据制作获取数据数据转为rosbag查看rosbag简介 ROS数据包(rosbag)是ROS系统中用于记录和回放传感器数据的重要工具,通常用于算法调试、系统测试和数据采集。传统上,rosbag依赖于ROS环…

浅谈PCB传输线(一)

前言&#xff1a;浅谈传输线的类型&#xff0c;以及传输线的一些行为特性。 1.传输线的种类 2.互连线被视为传输线的场景 3.传输线的行为特性*** 1.传输线的种类 PCB 中的信号传输线通常有两种基本类型: 微带线和带状线。此外&#xff0c;还有第三种类型–共面线(没有参考平面…