Qt QTableWidget 实现行选中及行悬浮高亮效果

 更新时间:2024年09月23日 11:38:02   作者:为啥不吃肉捏  
使用Qt开发中,实现表格的行选中和悬浮高亮效果是一个常见需求,但Qt自带的方法无法直接实现,解决方案是通过子类化QStyledItemDelegate并重写其paint函数来定制化绘制过程,本文给大家介绍Qt QTableWidget 实现行选中及行悬浮高亮效果,感兴趣的朋友一起看看吧

表格整行的 selected、hover 高亮需求很常见,但使用 Qt 提供的开箱即用的方法根本无法实现这个需求(至少在当前的时间节点是不行的);想要实现这个效果必须要费一点点力气,我们尽量选择较为简单的方法。

话不多说,先看效果图:

演示

实现的原理

经常用 QWidgets 的朋友应该都知道,框架中的 QTableWidget、QTreeWidget、QListWidget 等控件以及它们的基类 xxView 都是 MVD(model、view、delegate) 的结构,实现整行选中我们选择子类化 QStyledItemDelegate 的方式,这个方法较为简单,不会增加太多的心智负担,只需要以下几个步骤:

  • 创建一个类继承于 QStyledItemDelegate
  • 将外部将要使用这个 delegate 的 QTableWidget 传入,这里我选择了作为构造函数的参数,形式无所谓,只要确保在使用的时候此对象有效即可
  • 重写基类的 paint 函数,客制化逻辑
  • 创建对象,设置给 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
{
    //选中状态或是在鼠标下方的状态
    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 设置下样式表:

QTableView::item:hover
{
	background-color: red;
}
QTableView::item:selected
{
	background-color: blue;
}

到此这篇关于Qt QTableWidget 实现行选中及行悬浮高亮效果的文章就介绍到这了,更多相关Qt QTableWidget 行悬浮高亮内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>的解决方案

    Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>的

    如果大家也遇到下面这种问题,可能是没有include文件夹中没有bits/stdc++.h,这篇文章主要介绍了Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>的解决方案,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • 一起来了解c语言的str函数

    一起来了解c语言的str函数

    这篇文章主要为大家详细介绍了c语言的str函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Qt实现配置文件读写操作的示例详解

    Qt实现配置文件读写操作的示例详解

    这篇文章主要为大家详细介绍了如何使用Qt实现配置文件读写操作,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05
  • Qt实现密码显示按钮

    Qt实现密码显示按钮

    这篇文章主要为大家详细介绍了Qt实现密码显示按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++获取当前系统时间的方法总结

    C++获取当前系统时间的方法总结

    这篇文章主要介绍了C++获取当前系统时间的方法,实例总结了四个获取系统时间的方法,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C++基础概念讲述

    C++基础概念讲述

    这篇文章主要介绍了C++基础概念,​ 本次为C++的一个开篇,重点是更好的理解C++相对于其他编程语言的一个特性,之后会持续更新,本次专栏计划是掌握C++的基础语法以及常用特性,并且从细节上去理解,需要的朋友可以参考一下
    2021-12-12
  • 在C语言中对utmp文件进行查找和写入操作的函数小结

    在C语言中对utmp文件进行查找和写入操作的函数小结

    这篇文章主要介绍了在C语言中对utmp文件进行查找和写入操作的函数小结,包括pututline()函数和getutline()函数以及getutid()函数,需要的朋友可以参考下
    2015-08-08
  • C++实现打印两个有序链表公共部分的方法

    C++实现打印两个有序链表公共部分的方法

    这篇文章主要介绍了C++实现打印两个有序链表公共部分的方法,涉及C++针对有序链表的简单遍历、比较相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • C++ MiniZip实现目录压缩与解压的示例详解

    C++ MiniZip实现目录压缩与解压的示例详解

    Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法,本文主要为大家详细介绍了如何利用Zlib实现目录压缩与解压,需要的小伙伴可以参考下
    2023-11-11
  • C++中POCO库的安装与基础知识介绍(Windwos和Linux)

    C++中POCO库的安装与基础知识介绍(Windwos和Linux)

    这篇文章主要为大家介绍了C++ POCO库的简单介绍、下载以及安装方式、简单代码示例,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-05-05

最新评论