欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt?QTableWidget?實(shí)現(xiàn)行選中及行懸浮高亮效果

 更新時(shí)間:2024年09月23日 11:38:02   作者:為啥不吃肉捏  
使用Qt開(kāi)發(fā)中,實(shí)現(xiàn)表格的行選中和懸浮高亮效果是一個(gè)常見(jiàn)需求,但Qt自帶的方法無(wú)法直接實(shí)現(xiàn),解決方案是通過(guò)子類化QStyledItemDelegate并重寫(xiě)其paint函數(shù)來(lái)定制化繪制過(guò)程,本文給大家介紹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)文章

最新評(píng)論