Qt?QTableWidget?實(shí)現(xiàn)行選中及行懸浮高亮效果
表格整行的 selected、hover 高亮需求很常見(jiàn),但使用 Qt 提供的開(kāi)箱即用的方法根本無(wú)法實(shí)現(xiàn)這個(gè)需求(至少在當(dāng)前的時(shí)間節(jié)點(diǎn)是不行的);想要實(shí)現(xiàn)這個(gè)效果必須要費(fèi)一點(diǎn)點(diǎn)力氣,我們盡量選擇較為簡(jiǎn)單的方法。
話不多說(shuō),先看效果圖:
實(shí)現(xiàn)的原理
經(jīng)常用 QWidgets 的朋友應(yīng)該都知道,框架中的 QTableWidget、QTreeWidget、QListWidget 等控件以及它們的基類 xxView 都是 MVD(model、view、delegate) 的結(jié)構(gòu),實(shí)現(xiàn)整行選中我們選擇子類化 QStyledItemDelegate 的方式,這個(gè)方法較為簡(jiǎn)單,不會(huì)增加太多的心智負(fù)擔(dān),只需要以下幾個(gè)步驟:
- 創(chuàng)建一個(gè)類繼承于 QStyledItemDelegate
- 將外部將要使用這個(gè) delegate 的 QTableWidget 傳入,這里我選擇了作為構(gòu)造函數(shù)的參數(shù),形式無(wú)所謂,只要確保在使用的時(shí)候此對(duì)象有效即可
- 重寫(xiě)基類的 paint 函數(shù),客制化邏輯
- 創(chuàng)建對(duì)象,設(shè)置給 QTableWidget
頭文件
#include <QStyledItemDelegate> #include <QTableWidget> class HoveredRowItemDelegate : public QStyledItemDelegate { public: explicit HoveredRowItemDelegate(QTableWidget *parent = nullptr); protected: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; private: const QTableWidget *tableWidget{}; };
源文件
#include "hoveredrowitemdelegate.h" #include <QPainter> HoveredRowItemDelegate::HoveredRowItemDelegate(QTableWidget *parent) : QStyledItemDelegate{parent} { tableWidget = parent; } void HoveredRowItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { //選中狀態(tài)或是在鼠標(biāo)下方的狀態(tài) if(option.state.testFlag(QStyle::State_Selected) || option.state.testFlag(QStyle::State_MouseOver)) { QTableWidgetItem *hoveredItem = tableWidget->item(index.row(), index.column()); if(hoveredItem) { const int row = hoveredItem->row(); //遍歷列,繪制此行的所有列 for(int column = 0; column < tableWidget->columnCount(); column++) { QTableWidgetItem *item = tableWidget->item(row, column); if(item) { QModelIndex index = tableWidget->model()->index(row, column); QStyleOptionViewItem itemOption = option; itemOption.index = index; itemOption.rect = tableWidget->visualItemRect(item); QStyledItemDelegate::paint(painter, itemOption, index); } } } } else { return QStyledItemDelegate::paint(painter, option, index); } }
使用
auto delegate = new HoveredRowItemDelegate(ui->tableWidget); ui->tableWidget->setItemDelegate(delegate);
QTableWidget 設(shè)置下樣式表:
QTableView::item:hover { background-color: red; } QTableView::item:selected { background-color: blue; }
到此這篇關(guān)于Qt QTableWidget 實(shí)現(xiàn)行選中及行懸浮高亮效果的文章就介紹到這了,更多相關(guān)Qt QTableWidget 行懸浮高亮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ inline內(nèi)聯(lián)函數(shù)詳解
這篇文章主要介紹了C++ inline內(nèi)聯(lián)函數(shù)詳解,有感興趣的同學(xué)可以借鑒參考下2021-02-02C++實(shí)現(xiàn)LeetCode(82.移除有序鏈表中的重復(fù)項(xiàng)之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(82.移除有序鏈表中的重復(fù)項(xiàng)之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07深入解析C++11?lambda表達(dá)式/包裝器/線程庫(kù)
這篇文章主要介紹了C++11?lambda表達(dá)式/包裝器/線程庫(kù)的相關(guān)知識(shí),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C語(yǔ)言完美實(shí)現(xiàn)動(dòng)態(tài)數(shù)組代碼分享
本文給大家分享的是一則使用C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的代碼,完美解決內(nèi)存溢出以及內(nèi)存回收問(wèn)題,有需要的小伙伴可以參考下。2016-02-02C++中標(biāo)準(zhǔn)線程庫(kù)的基本使用介紹
大家好,本篇文章主要講的是C++中標(biāo)準(zhǔn)線程庫(kù)的基本使用介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02Qt鍵盤(pán)事件實(shí)現(xiàn)圖片在窗口上下左右移動(dòng)
這篇文章主要為大家詳細(xì)介紹了Qt鍵盤(pán)事件實(shí)現(xiàn)圖片在窗口上下左右移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C++實(shí)現(xiàn)猜數(shù)小游戲的實(shí)現(xiàn)
這篇文章主要介紹了C++實(shí)現(xiàn)猜數(shù)小游戲的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02