Qt?QTableWidget?實(shí)現(xiàn)行選中及行懸浮高亮效果
表格整行的 selected、hover 高亮需求很常見,但使用 Qt 提供的開箱即用的方法根本無法實(shí)現(xiàn)這個(gè)需求(至少在當(dāng)前的時(shí)間節(jié)點(diǎn)是不行的);想要實(shí)現(xiàn)這個(gè)效果必須要費(fèi)一點(diǎn)點(diǎn)力氣,我們盡量選擇較為簡單的方法。
話不多說,先看效果圖:

實(shí)現(xiàn)的原理
經(jīng)常用 QWidgets 的朋友應(yīng)該都知道,框架中的 QTableWidget、QTreeWidget、QListWidget 等控件以及它們的基類 xxView 都是 MVD(model、view、delegate) 的結(jié)構(gòu),實(shí)現(xiàn)整行選中我們選擇子類化 QStyledItemDelegate 的方式,這個(gè)方法較為簡單,不會(huì)增加太多的心智負(fù)擔(dān),只需要以下幾個(gè)步驟:
- 創(chuàng)建一個(gè)類繼承于 QStyledItemDelegate
- 將外部將要使用這個(gè) delegate 的 QTableWidget 傳入,這里我選擇了作為構(gòu)造函數(shù)的參數(shù),形式無所謂,只要確保在使用的時(shí)候此對象有效即可
- 重寫基類的 paint 函數(shù),客制化邏輯
- 創(chuàng)建對象,設(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio 2022中創(chuàng)建的C++項(xiàng)目無法使用萬能頭<bits/stdc++.h>的
如果大家也遇到下面這種問題,可能是沒有include文件夾中沒有bits/stdc++.h,這篇文章主要介紹了Visual Studio 2022中創(chuàng)建的C++項(xiàng)目無法使用萬能頭<bits/stdc++.h>的解決方案,感興趣的朋友跟隨小編一起看看吧2024-02-02
C++獲取當(dāng)前系統(tǒng)時(shí)間的方法總結(jié)
這篇文章主要介紹了C++獲取當(dāng)前系統(tǒng)時(shí)間的方法,實(shí)例總結(jié)了四個(gè)獲取系統(tǒng)時(shí)間的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
在C語言中對utmp文件進(jìn)行查找和寫入操作的函數(shù)小結(jié)
這篇文章主要介紹了在C語言中對utmp文件進(jìn)行查找和寫入操作的函數(shù)小結(jié),包括pututline()函數(shù)和getutline()函數(shù)以及getutid()函數(shù),需要的朋友可以參考下2015-08-08
C++實(shí)現(xiàn)打印兩個(gè)有序鏈表公共部分的方法
這篇文章主要介紹了C++實(shí)現(xiàn)打印兩個(gè)有序鏈表公共部分的方法,涉及C++針對有序鏈表的簡單遍歷、比較相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
C++?MiniZip實(shí)現(xiàn)目錄壓縮與解壓的示例詳解
Zlib是一個(gè)開源的數(shù)據(jù)壓縮庫,提供了一種通用的數(shù)據(jù)壓縮和解壓縮算法,本文主要為大家詳細(xì)介紹了如何利用Zlib實(shí)現(xiàn)目錄壓縮與解壓,需要的小伙伴可以參考下2023-11-11
C++中POCO庫的安裝與基礎(chǔ)知識介紹(Windwos和Linux)
這篇文章主要為大家介紹了C++ POCO庫的簡單介紹、下載以及安裝方式、簡單代碼示例,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-05-05

