【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.mzph.cn/bicheng/66396.shtml

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

相关文章

高并发场景下的秒杀系统架构设计与实现

引言 秒杀系统是一种高并发场景的典型应用&#xff0c;广泛存在于电商平台、抢票系统和促销活动中。秒杀活动的特点是短时间内吸引大量用户同时访问并尝试抢购商品&#xff0c;这对系统的高并发处理能力、稳定性和用户体验提出了极高的要求。 在秒杀系统中&#xff0c;常见的…

【渗透测试术语总结】

Top 渗透测试常用专业术语 相信大家和我一样&#xff0c;搞不清这些专业名词的区别&#xff0c;所以我来整理一下。 1. POC、EXP、Payload与Shellcode POC&#xff1a;全称 Proof of Concept &#xff0c;中文 概念验证 &#xff0c;常指一段漏洞证明的代码。 EXP&#xf…

企业网络性能监控

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

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习(L14+L15+L16)

文章目录 Section 4&#xff1a;The Vim Help System&#xff08;Vim 帮助系统&#xff09;S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…

Zookeeper是如何解决脑裂问题的?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper是如何解决脑裂问题的?】面试题。希望对大家有帮助&#xff1b; Zookeeper是如何解决脑裂问题的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper 通过一系列的机制来防止和解决脑裂&#xff08;sp…

【C++】const关键字_运算符重载_继承

目录 Const关键字 常量 常量指针 参数传递 返回值 成员函数 const作用域 运算符重载 继承 继承同名静态成员函数 构造和析构的调用顺序 多重继承 菱形继承&#xff08;二义性&#xff09; 虚继承的工作原理 友元 常&#xff08;成员&#xff09;函数 Const关键字…

QT-窗口嵌入外部exe

窗口类&#xff1a; #pragma once #include <QApplication> #include <QWidget> #include <QVBoxLayout> #include <QProcess> #include <QTimer> #include <QDebug> #include <Windows.h> #include <QWindow> #include <…

Java(day4)

二维数组 静态初始化 动态初始化 练习 public class test1 {public static void main(String[]args){int arr[][]{{22,66,44},{77,33,88},{25,45,65},{11,66,99}};int sum0;for(int i0;i<arr.length;i){int a0;for(int j0;j<arr[i].length;j){sumarr[i][j];aarr[i][j];…

「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统

本篇教程将实现一个模拟火车票查询系统&#xff0c;通过输入条件筛选车次信息&#xff0c;并展示动态筛选结果&#xff0c;学习事件处理、状态管理和界面展示的综合开发技巧。 关键词 条件筛选动态数据展示状态管理UI交互查询系统 一、功能说明 模拟火车票查询系统包含以下功…

Git 仓库清理方法

方法一&#xff1a;删除 Git 仓库 1. 删除 .git 文件夹 # Linux/Mac rm -rf .git# Windows rd /s /q .git2. 删除整个项目 直接删除项目文件夹&#xff0c;然后重建一个新的。 注意&#xff1a;删除后&#xff0c;使用 git init 重新初始化一个干净的仓库。 方法二&#x…

粒子的动力学和约束

本文先介绍单粒子的力学(mechanics of a particle),然后再介绍粒子系的力学(mechanics of particle system),最后介绍约束(constraints)。 1. 单粒子的动力学 从原点出发有一个失径,记为 r \bm{r} r,速度矢量记为 v \bm{v} v,则: v = d r d t ( 1.1 ) \bm{v} = \frac{…

Cherno C++学习笔记 P50 C++当中的动态库

在上一篇文章当中我们学习了C当中是如何使用静态库的&#xff0c;这一篇我们会讲一下如何使用动态库&#xff0c;并同样用GLFW这个已有的库来举例子。 有了静态库的经验&#xff0c;其实动态库就好理解和使用多了。这两者的区别是&#xff0c;静态链接发生在编译的时候&#x…

基于GAN和RL的思想来训练对话生成

Paper https://arxiv.org/pdf/1701.06547.pdf 基于GAN和RL的思想来训练对话生成 Implementation https://github.com/jiweil/Neural-Dialogue-Generation/tree/master/Adversarial

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度 一&#xff0c; PWM实现原理二&#xff0c;软件实现三&#xff0c;正点原子裸机开发总结 一&#xff0c; PWM实现原理 PWM和学习51时候基本上一致&#xff0c;控制频率&#xff08;周期&#xff09;和占空比&#xff0c;51实验…

1.Python浅过(语法基础)

1.简介 Python是一种面向对象的解释型高级编程语言&#xff0c;是强类型的动态脚本语言。 解释型语言跨平台性比编译型语言&#xff08;如c语言&#xff09;好。 print("hello world")2.Bug,Debug 多看&#xff0c;多思考&#xff0c;多尝试、查资料、记录 3.prin…

C 语言函数指针 (Pointers to Functions, Function Pointers)

C 语言函数指针 {Pointers to Functions, Function Pointers} 1. Pointers to Functions (函数指针)2. Function Pointers (函数指针)2.1. Declaring Function Pointers2.2. Assigning Function Pointers2.3. Calling Function Pointers 3. Jump Tables (转移表)References 1. …

C++泛型编程:函数模版定义、函数模版调用,与普通函数调用区别

泛型编程&#xff1a;这个是一种编程范式&#xff0c;他的目的是编写适合多种数据类型的代码。 函数模版&#xff1a; template<typename t> 函数的定义 我们来结合代码理解一下内容&#xff0c;首先定义好函数&#xff0c;然后我们通过方式来调用下&#xff0c;有两…

Flutter:邀请海报,Widget转图片,保存相册

记录下&#xff0c;把页面红色区域内的内容&#xff0c;转成图片后保存到相册的功能 依赖 # 生成二维码 qr_flutter: ^4.1.0 # 保存图片 image_gallery_saver_plus: ^3.0.5view import package:demo/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; i…

laravel 批量更新:‌INSERT ... ON DUPLICATE KEY UPDATE

在SQL批量更新时可通过INSERT ... ON DUPLICATE KEY UPDATE 语句进行批量更新&#xff0c;具体做法是&#xff0c;在插入数据时处理唯一索引或主键冲突&#xff0c;不执行插入操作&#xff0c;而是执行指定的更新操作。 INSERT INTO table_name(column1, column2, ...) VALUES…

JVM实战—12.OOM的定位和解决

大纲 1.如何对系统的OOM异常进行监控和报警 2.如何在JVM内存溢出时自动dump内存快照 3.Metaspace区域内存溢出时应如何解决(OutOfMemoryError: Metaspace) 4.JVM栈内存溢出时应如何解决(StackOverflowError) 5.JVM堆内存溢出时应该如何解决(OutOfMemoryError: Java heap s…