【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();
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Improving Language Understanding by Generative Pre-Training GPT-1详细讲解

Improving Language Understanding by Generative Pre-Training 2018.06 GPT-1 0.有监督、半监督、无监督 CV&#xff1a;ImageNet pre-trained model NLP&#xff1a;pre-trained model? 在计算机视觉中任务包含分类、检测、分割&#xff0c;任务类别数少&#xff0c;对应…

大数据技术 指令笔记1

3.cd命令 cd命令用来切换工作目录至DirName。其中DirName表示法可为绝对路径或相对路径 例如&#xff1a; cd/ 切换到根目录 cd 切换到家目录 cd /etc/sysconfig/ 切换到/etc/sysconfig目录 cd .. 返回到父目录 4.Is命令 Is命令用来列出文件或…

创建Java项目,并添加MyBatis包和驱动包

一 : Mybatis和jsp使用上,只有Dao层有区别 Mybatis 使用方法: 测试类的7步骤 1.读取核心配置文件 2.构建sql会话工厂 3.开启sql会话 4.获取mapper接口 5.调用相对应的增删改查方法 6.打印 7.关闭回话 /*** 用户列表* throws IOException*/Testpublic void roleList() throws IO…

【实用技能】如何使用 .NET C# 中的 Azure Key Vault 中的 PFX 证书对 PDF 文档进行签名

TX Text Control 是一款功能类似于 MS Word 的文字处理控件&#xff0c;包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理&#xff0c;网站内容发布&#xff0c;电子病历中病案模板创建、病历书写、修改历史、连续打…

结构化日志和集中日志服务

目录 结构化日志 Serilog使用 集中化日志 集中日志服务 Exceptionless 控制台项目 总结 结构化日志 结构化日志比普通文本更利于日志的分析&#xff0c;比如统计“邮件发送失败”错误发生了多少次。 NLog也可以配置结构化日志&#xff0c;不过配置麻烦&#xff0c;推荐…

OpenAI CEO 奥特曼发长文《反思》

OpenAI CEO 奥特曼发长文《反思》 --- 引言&#xff1a;从 ChatGPT 到 AGI 的探索 ChatGPT 诞生仅一个多月&#xff0c;如今我们已经过渡到可以进行复杂推理的下一代模型。新年让人们陷入反思&#xff0c;我想分享一些个人想法&#xff0c;谈谈它迄今为止的发展&#xff0c;…

Agentic RAG 解释

RAG&#xff08;检索增强生成&#xff09;通过提供来自外部知识源的相关背景来帮助提高 LLM 答案的准确性和可靠性。 Agentic RAG 是高级 RAG 版本&#xff0c;它使用 AI 代理来更加自主地行动。 Agentic RAG 执行以下操作 查询理解、分解和重写检索策略选择知识库管理结果综…

pg数据库运维经验2024

这篇文章主要是讲pg运维常见问题&#xff0c;两三年见一次的疑难杂症就不说了。 主要是技术性运维总结&#xff0c;主打通俗易懂和快速上手&#xff0c;尽量避免源码层面等深入分析。 SQL性能与执行计划 执行计划突变 pg官方不支持hint功能&#xff0c;并且计划永远不支持&…

每日一题-两个链表的第一个公共结点

文章目录 两个链表的第一个公共结点问题描述示例说明示例 1示例 2 方法及实现方法描述代码实现 复杂度分析示例运行过程示例 1示例 2 总结备注 两个链表的第一个公共结点 问题描述 给定两个无环的单向链表&#xff0c;找到它们的第一个公共节点。如果没有公共节点&#xff0c…

生成模型:变分自编码器-VAE

1.基本概念 1.1 概率 这里有&#xff1a; x为真实图像&#xff0c;开源为数据集, 编码器将其编码为分布参数 x ^ \hat{x} x^为生成图像, 通过解码器获得 p ( x ) ^ \hat{p(x)} p(x)^​: 观测数据的分布, 即数据集所构成的经验分布 p r e a l ( x ) p_{real}(x) preal​(x): …

攻防世界 wtf.sh-150

点进去&#xff0c;发现是一个类似于论坛的网站&#xff0c;并且对报错等做了处理 用御剑扫描一下 ​ 发现是php形式的文件&#xff0c;但点进去访问不了。看看wp&#xff0c;发现此题存在路径穿越漏洞&#xff0c;就是&#xff08;如果应用程序使用用户可控制的数据&#xff0…

Google Play开发者账号的高风险行为解析

在安卓应用开发行业里&#xff0c;Google Play 开发者账号是开发者们通向全球用户的重要桥梁。凭借它&#xff0c;开发者们能够将精心打造的应用推向市场&#xff0c;然而&#xff0c;开发者账号的使用也包含了诸多风险&#xff0c;一些不经意的操作可能会给开发者账号带来封禁…

网络安全-web应用程序发展历程(基础篇)

1.网站程序发展 web1.0 网站是别人的&#xff0c;只能是随便看看 web2.0网站是朋友的&#xff0c;可以进行交流了 web3.0网站是自己的&#xff0c;可以实现买卖交流。 静态内容阶段&#xff1a;web由大量的静态文档构成&#xff0c;web被看作成超文本共享文件服务器。别人只…

继承(6)

大家好&#xff0c;今天我们来继续学习继承的内容&#xff0c;了解一下this和super两者的一些特性和区别。话不多说&#xff0c;来看。 1.7 super 和 this super和 this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那他们之间有…

[离线数仓] 总结二、Hive数仓分层开发

接 [离线数仓] 总结一、数据采集 5.8 数仓开发之ODS层 ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比率,较高的,此处选择gzip。 CompressedStorage - Apache Hive - Apac…

3D机器视觉的类型、应用和未来趋势

3D相机正在推动机器视觉市场的增长。很多制造企业开始转向自动化3D料箱拣选&#xff0c;专注于使用3D视觉和人工智能等先进技术来简化操作并减少开支。 预计3D相机将在未来五年内推动全球机器视觉市场&#xff0c;这得益于移动机器人和机器人拣选的强劲增长。到 2028 年&#…

Mac-docker配置

1.配置的文件路径 cd ~/.docker (base) zhangyaweimacbookair .docker % ls buildx cli-plugins config.json contexts daemon.json desktop-build mutagen run (base) zhangyaweimacbookair .docker % cat daemon.json## 重启docker服务 sudo systemctl daemon-reload sudo…

SSM-SpringMVC-请求响应、REST、JSON

目录 “为什么要学 SpringMVC&#xff1f;它和 Servlet 是什么关系&#xff1f;” “什么是异步&#xff1f;为什么异步交互中常用 JSON 格式&#xff1f;异步请求和 JSON 如何配合&#xff1f;” 一、概述 SpringMVC主要负责 1 SpringMVC的常用组件 2 SpringMVC的工作流程…

【Arm】Arm 处理器的半主机(semihosting)机制

概览 通过 semihosting 机制&#xff0c;主机可以通过调试器使用目标计算机 IO 接口。 例如开发者的 PC 通过 J-Link 来使用 STM32 MCU 的输入输出。 这些功能的示例包括键盘输入、屏幕输出和硬盘 I/O。例如&#xff0c;可以使用此机制启用 C Library 中的函数&#xff0c;如…

网络安全-XSS跨站脚本攻击(基础篇)

漏洞扫描的原理 1.跨站脚本攻击介绍 xss跨站脚本攻击&#xff1a; xSS 全称&#xff08;Cross site Scripting &#xff09;跨站脚本攻击&#xff0c;是最常见的Web应用程序安全漏洞之一&#xff0c;位于OWASP top 10 2013/2017年度分别为第三名和第七名&#xff0c;XSS是指攻…