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.pswp.cn/web/77582.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77582.shtml
英文地址,請注明出處:http://en.pswp.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;還有第三種類型–共面線(沒有參考平面…