Qt实现QTableView鼠标悬浮行高亮显示
创作时间:
作者:
@小白创作中心
Qt实现QTableView鼠标悬浮行高亮显示
引用
CSDN
1.
https://m.blog.csdn.net/chenjin_2/article/details/144965549
在Qt开发中,QTableView是一个常用的表格控件,但默认情况下并不支持鼠标悬浮时的行高亮显示功能。本文将详细介绍如何通过自定义委托类HoverDelegate实现这一功能,并提供完整的代码示例。
1. 自定义委托类 HoverDelegate
首先,我们需要创建一个自定义的委托类HoverDelegate,继承自QStyledItemDelegate。这个类的主要作用是在鼠标悬浮时改变行的背景颜色。
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中使用这个自定义的委托类。
设置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; // 表示事件已经被处理
// }
if (event->type() == QEvent::MouseMove) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
QTableView *tableView = qobject_cast<QTableView*>(object->parent());
if (tableView) {
QModelIndex index = tableView->indexAt(mouseEvent->pos());
int newRow = index.isValid() ? index.row() : -1;
// 检查是否需要更新悬停行
if (newRow != m_hoverRow) {
m_hoverRow = newRow;
delegate->setHoverRow(m_hoverRow);
// 更新视图以反映新的悬停状态
tableView->viewport()->update();
}
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();
}
点击运行。效果如下
热门推荐
如何优化家居的功能分区?这种优化有哪些实际效果?
云南白药是国企吗?云南白药和云南三七的区别详解
哪个外企招聘平台适合应届生
如何选择合适的国债基金进行投资
顶尖985大学排名:评估标准与选择建议
周敦颐与《爱莲说》:宋明理学在江西的绽放
儿童尿液产生大量泡沫是否为糖尿病的象征
如何理解配股对股东权益的影响?这种配股如何影响投资者的持股决策?
构建地质灾害监测预警系统,提升防灾减灾能力
国家卫健委发布:康复、中医领域将全面应用AI,11个应用场景详解
云盘文件过期如何恢复?四种实用方法详解
如何清除iPad上的系统数据:100%有效方法
如何长期规划创业项目
表见代理的指导案例解析及实务运用
过量食用奶油蛋糕会导致肥胖吗?
减重饮食这样吃最有效!实证医学力推的10大减重饮食法则与成效分析
表见代理的定义是什么
人身损害赔偿案件中,如何确定护理费用
泉州中山路:融合多元文化 守护烟火生活
什么水果解暑效果好,夏天消暑解渴的水果有哪些?
“看脸”很重要,这几种面相可能是身体在报警,千万别忽视
义乌农民画:家门口的蓬勃诗意
如何控制生活方式以保持减肥瘦身后的体型
家族信托绝非 “保险箱”!这些问题需要避免
整形医生解析:泪沟凹陷的成因与治疗方案全攻略
八大局探秘五日游:淄博美食与文化之旅
股票基本面分析:从财务到政策全方位解读
血糖高可以吃蜂蜜吗?专家解读蜂蜜与血糖的关系
紫薯坏了是什么样子?教你正确辨别和储存紫薯
百年卤味30年特制老卤水配方秘诀