【QT-QTableView实现鼠标悬浮(hover)行高亮显示+并设置表格样式】

1、自定义委托类 HoverDelegate
hoverdelegate.h

#ifndef HOVERDELEGATE_H
#define HOVERDELEGATE_H

#include <QObject>
#include <QStyledItemDelegate>

class hoverdelegate : public QStyledItemDelegate
{
    Q_OBJECT // 添加 Q_OBJECT 宏

public:
    explicit hoverdelegate(QObject *parent = nullptr);
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
    void setHoverRow(int row);

signals:
    void hoverChanged(int newRow);// 带参数的信号,表示新的悬停行

private:
    int hoverRow;
};

#endif // HOVERDELEGATE_H

hoverdelegate.cpp

#include "hoverdelegate.h"
#include "qdebug.h"
#include <QPainter>
hoverdelegate::hoverdelegate(QObject *parent)
    : QStyledItemDelegate{parent}
{}

void hoverdelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyleOptionViewItem opt = option;

    initStyleOption(&opt, index); // 确保初始化样式选项
    if (index.row() == hoverRow &&  !(opt.state & QStyle::State_Selected)) {
        qDebug() << "xxxx";
        // 如果是悬停行,则修改背景颜色
        opt.backgroundBrush = QBrush(QColor(200, 230, 255)); // 浅蓝色背景
        qDebug() << "============";
        //qDebug() << "xxxx";
    }

    // 显式绘制背景
    painter->save();
    painter->fillRect(opt.rect, opt.backgroundBrush);
    painter->restore();

    QStyledItemDelegate::paint(painter, opt, index);
}

void hoverdelegate::setHoverRow(int row)
{
    if (hoverRow != row) {
        hoverRow = row;
        emit hoverChanged(hoverRow);
    }
}

2、如何使用
在这里插入图片描述
设置QTableView 样式

/* 标题头 */
 QHeaderView {
            background: rgba(86, 186, 202, 1);
            color: #000000;
            font-size: 16px;
            line-height: 22px;
 }

QHeaderView::section {
            font-size: 16px;
            color: #000000;
            line-height: 22px;
            height: 31px;
            background: rgba(195, 231, 254, 1);
            border: none;
        }

/* 整个表格控件 */
QTableView {
            color: #000000;
            border: 0px solid rgba(56, 66, 70, 1);
            font-size: 16px;
            line-height: 24px;
 }

QTableView::item {
            border-bottom: 1px solid rgb(159, 212, 235);
 }

/* 每个单元格被选中状态 */
        QTableView::item:selected {
            background: rgba(86, 186, 202, 1);
            color: #000000;
 }
/* 可选:鼠标悬停时改变行颜色 */
 /*QTableView::item:hover {
            background-color: rgba(200, 230, 255, 1); /* 浅蓝色背景 */
/*}

初始化表格 使表格好看

 QStringList title;
    title <<LOCAL("id") << LOCAL("姓名") <<LOCAL("身份证") << LOCAL("性别") << LOCAL("学院")<< LOCAL("账号") << LOCAL("密码");
    teacherModel->setHorizontalHeaderLabels(title);
    teacherModel->setColumnCount(7);
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->tableView->setColumnHidden(0, true);// 隐藏 ID 列 (假设 ID 是第 0 列)
    ui->tableView->verticalHeader()->hide(); // 隐藏每行标题头
    ui->tableView->setFocusPolicy(Qt::NoFocus);//禁用虚线框
    ui->tableView->horizontalHeader()->setHighlightSections(false);//关闭标题栏自动加粗。
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//选中整行。
    ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);// 设置选择模式为单选

在要使用hoverdelegate 的头文件中
定义 QStandardItemModel* teacherModel;

private:
    QStandardItemModel*  teacherModel;
    hoverdelegate *delegate;
    int m_hoverRow; // 当前悬停行
private slots:
    void onHoverChanged(int newRow);
protected:
    bool eventFilter(QObject *object, QEvent *event);   

在使用hoverdelegate 的源文件中
初始化teacherModel 和 delegate

teacherModel = new QStandardItemModel(this);
delegate = new hoverdelegate(this);

设置数据模型

    // 设置数据模型
    ui->tableView->setModel(teacherModel)

设置自定义委托

// 设置自定义委托
    ui->tableView->setItemDelegate(delegate);

安装事件过滤器到 tableView 的视口

// 安装事件过滤器到 tableView 的视口
    ui->tableView->viewport()->installEventFilter(this);

启用鼠标跟踪

// 启用鼠标跟踪
    ui->tableView->setMouseTracking(true);

连接到 hoverChanged 信号

// 连接到 hoverChanged 信号
    connect(delegate, &hoverdelegate::hoverChanged, this, &UserManager::onHoverChanged);

编写鼠标监听事件

bool UserManager::eventFilter(QObject *object, QEvent *event)
{
    if (event->type() == QEvent::MouseMove && object == ui->tableView->viewport()) {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
        QModelIndex index = ui->tableView->indexAt(mouseEvent->pos());

        if (index.isValid()) {
            int newRow = index.row();
            if (newRow != m_hoverRow) {
                m_hoverRow = newRow;
                delegate->setHoverRow(m_hoverRow);
                ui->tableView->viewport()->update(); // 强制重新绘制

                ui->tableView->repaint(); // 强制立即重绘整个视图
            }
        } else {
            if (m_hoverRow != -1) {
                m_hoverRow = -1;
                delegate->setHoverRow(m_hoverRow);
                ui->tableView->viewport()->update(); // 强制重新绘制
                ui->tableView->repaint(); // 强制立即重绘整个视图
            }
        }

        return true; // 表示事件已经被处理
    }

    return QObject::eventFilter(object, event);
}

编写onHoverChanged 方法

void UserManager::onHoverChanged(int newRow)
{
    qDebug() << "Hover row changed to:" << newRow;

    // 更新当前悬停行并强制重新绘制表格
    m_hoverRow = newRow;
    ui->tableView->viewport()->update();
}

点击运行。效果如下
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业网络性能监控

什么是网络性能监控 网络性能监控&#xff08;NPM&#xff09;是指对计算机网络的性能进行持续测量、分析和管理的过程&#xff0c;通过监控流量、延迟、数据包丢失、带宽利用率和正常运行时间等关键指标&#xff0c;确保网络高效、安全地运行&#xff0c;并将停机时间降至最低…

引领AI发展潮流:打造大模型时代的安全与可信——CCF-CV企业交流会走进合合信息会议回顾

一、前言 随着数字化浪潮的推动&#xff0c;人工智能技术正在以前所未有的速度深刻改变着我们的生活、工作方式以及社会结构。AI技术的飞速发展不仅为各行业带来了前所未有的机遇&#xff0c;也同时引发了关于其风险与挑战的广泛关注。如何平衡技术进步与安全保障&#xff0c;…

List ---- 模拟实现LIST功能的发现

目录 listlist概念 list 中的迭代器list迭代器知识const迭代器写法list访问自定义类型 附录代码 list list概念 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素…

Matlab回归预测大合集(不定期更新)-188

截至2025-1-2更新 1.BP神经网络多元回归预测&#xff08;多输入单输出&#xff09; 2.RBF神经网络多元回归预测&#xff08;多输入单输出&#xff09; 3.RF随机森林多元回归预测&#xff08;多输入单输出&#xff09; 4.CNN卷积神经网络多元回归预测&#xff08;多输入单输…

go语言zero框架中教务crm系统的在职继承和离职交接的设计与实践

在GoZero中实现一个在职继承和离职交接的通用模块&#xff0c;涉及到顾问离职交接客户、领导离职交接审批单据等功能。为了使这个模块通用且易于扩展&#xff0c;我们可以分成几个部分&#xff1a; 1. **数据模型设计**&#xff1a;我们首先需要设计离职交接相关的数据模型。 …

Mac软件介绍之录屏软件Filmage Screen

软件介绍 Filmage Screen 是一款专业的视频录制和编辑软件&#xff0c;适用于 Mac 系统 可以选择4k 60fps&#xff0c;可以选择录制电脑屏幕&#xff0c;摄像头录制&#xff0c;可以选择区域录制。同时也支持&#xff0c;简单的视频剪辑。 可以同时录制电脑麦克风声音 标准…

毕业项目推荐:基于yolov8/yolov5的行人检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

对话|企业如何构建更完善的容器供应链安全防护体系

对话&#xff5c;企业如何构建更完善的容器供应链安全防护体系 云布道师 随着云计算和 DevOps 的兴起&#xff0c;容器技术和自动化成为软件开发中的必要手段&#xff0c;软件供应链也进入了自动化及 CI/CD 阶段。然而&#xff0c;容器技术和自动化虽然提升了软件的更新速度&…

小试牛刀-SpringBoot集成SOL链

目录 一、什么是solanaj? 二、Pom依赖 三、主要类 3.1 RpcClient 3.2 PublicKey 3.3 Transaction 3.4 TransactionInstruction 四、示例代码 Welcome to Code Blocks blog 本篇文章主要介绍了 [小试牛刀-SpringBoot集成SOL链] ❤博主广交技术好友&#xff0c;喜欢文章的…

LLM之RAG实战(五十一)| 使用python和Cypher解析PDF数据,并加载到Neo4j数据库

一、必备条件&#xff1a; python语言Neo4j数据库python库&#xff1a;neo4j、llmsherpa、glob、dotenv 二、代码&#xff1a; from llmsherpa.readers import LayoutPDFReaderfrom neo4j import GraphDatabaseimport uuidimport hashlibimport osimport globfrom datetime …

牛客网刷题 ——C语言初阶(5操作符)——BC117 小乐乐走台阶

1.题目 &#xff1a;BC117 小乐乐走台阶 牛客OJ题链接 描述 小乐乐上课需要走n阶台阶&#xff0c;因为他腿比较长&#xff0c;所以每次可以选择走一阶或者走两阶&#xff0c;那么他一共有多少种走法&#xff1f; 输入描述&#xff1a; 输入包含一个整数n (1 ≤ n ≤ 30) …

gitlab高级功能之 CICD Steps

CICD Steps 1. 介绍2. 定义 Steps2.1 Inputs2.2 Outputs 3. Using steps3.1 Set environment variables3.2 Running steps locally 4. Scripts5. Actions5.1 已知的问题 6. 表达式7. 实操7.1 单个step7.2 多个step7.3 复用steps7.4 添加output到step7.5 使用远程step 1. 介绍 …

【Unity3D】UGUI Canvas画布渲染流程

目录 Screen Space - Overlay Screen Space - Camera World Space UI合批分析&#xff08;建议不看 直接看FrameDebugger测试&#xff09; 优化UI合批 1、Image图片纹理不同导致合批失败 2、文本和图片相交以及排序对合批的影响 3、Mask对合批的影响&#xff08;情况…

平安产险安徽分公司携手安徽中医药临床研究中心附属医院 共筑儿童安全防护网

为响应金融知识普及教育号召&#xff0c;平安产险安徽分公司联动安徽中医药临床研究中心附属医院&#xff0c;于近日在朝霞小学举办了一场儿童安全防范与健康守护活动。此次活动旨在提升学生的安全防范意识&#xff0c;守护儿童健康成长&#xff0c;同时有力推动金融知识与传统…

zephyr移植到STM32

Zephy如何移植到单片机 1. Window下搭建开发环境1.1 安装Choncolatey1.2 安装相关依赖1.3创建虚拟python环境1.4 安装west1.4.1 使用 pip 安装 west1.4.2 检查 west 安装路径1.4.3 将 Scripts路径添加到环境变量1.4.4 验证安装 1.5 获取zephyr源码和[安装python](https://so.cs…

fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权

已解决 fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权 没有声明内容协议导致的 微信公众平台&#xff1a;https://mp.weixin.qq.com/【1.左下角的-移动过去后会出现 “帐号设置”】 【2.基本设置->服务内容声明->修…

虚拟机 网络防御(预防信息泄露)

了解VMware网络基本配置 Bridged(桥接模式):虚拟机和主机好比在同一个网络环境下的两台电脑。 NAT(网络地址转换模式):NAT模式虚拟机通过主机进行联网。&#xff08;推荐&#xff09; Host-0nly(主机模式):主机模式将虚拟机与外网隔开&#xff0c;只能让虚拟机和虚拟机之间联…

打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程

打包后端‘ 1&#xff0c;打开若依&#xff0c;点击右侧的Maven展开Maven管理&#xff0c;选择ruoyi>Lifecycle 先双击clean清除原本启动项目时生成的文件。然后点击package等待项目打包&#xff0c;切记要取消运行再打包 打包完成后会在ruoyi-admin>src>target里面…

矩阵碰一碰发视频源码搭建全解析,支持OEM

在数字化营销与互动体验需求日益增长的当下&#xff0c;矩阵碰一碰发视频功能以其独特的交互性和高效的信息传播能力&#xff0c;正逐渐成为吸引用户、提升品牌影响力的有力工具。本文将深入探讨如何搭建矩阵碰一碰发视频的源码&#xff0c;帮助开发者实现这一创新功能。 一、技…

专题十四——BFS

目录 一BFS解决FloodFill算法 1图像渲染 2岛屿数量 3岛屿的最大面积 4被环绕的区域 二BFS解决蛋源最短路径问题 1迷宫中离入口最近的出口 2最小基因变化 3单词接龙 4为高尔夫比赛砍树 三BFS解决多源最短路径问题 1 01矩阵 2飞地的数量 3地图中的最高点 4地图分…