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.pswp.cn/diannao/42162.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42162.shtml
英文地址,請注明出處:http://en.pswp.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…