QTableWidget实现鼠标悬停整行高亮显示

news2024/12/25 23:39:15

一、最终效果
 

二、 重写QTableWidget类

mytablewidget.h

#ifndef MYTABLEWIDGET_H
#define MYTABLEWIDGET_H

#include <QTableWidget>

class MyTableWidget : public QTableWidget
{
public:
    explicit MyTableWidget(QWidget* parent = nullptr);

protected:
    void leaveEvent(QEvent *event);  //鼠标离开事件

    bool eventFilter(QObject *obj, QEvent *event);  //事件过滤器

private slots:
    void itemChange();  //鼠标点击

private:
    int m_oldEnteredRow;  //上一次改变背景色的行号
};

#endif // MYTABLEWIDGET_H

mytablewidget.cpp

#include "mytablewidget.h"
#include <QTableWidgetItem>
#include <QHeaderView>
#include <QDebug>
#include <QMouseEvent>

MyTableWidget::MyTableWidget(QWidget *parent) : QTableWidget(parent)
{
    this->setSelectionBehavior(QAbstractItemView::SelectRows);  //整行选中

    //设置表格控件不可编辑
    this->setEditTriggers(QAbstractItemView::NoEditTriggers);
    this->setSortingEnabled(false);

    this->verticalHeader()->hide(); //隐藏竖标题栏
    this->horizontalHeader()->hide(); //隐藏横标题栏

    this->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);  //自动设置行高
    this->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);  //自动设置列宽
    //this->verticalHeader()->setStretchLastSection(true); //最后一行拉伸
    this->horizontalHeader()->setStretchLastSection(true); //最后一列拉伸

    this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);  //去掉水平滚动条
    this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);  //去掉垂直滚动条

    this->setShowGrid(false); //不显示线框
    this->setStyleSheet(QString("QTableWidget{background-color:red;color:green;outline:0px;}"
                                "QTableWidget::item:selected{background-color:green;color:red;outline:0px;}"));

    connect(this, &MyTableWidget::itemSelectionChanged, this, &MyTableWidget::itemChange);
    m_oldEnteredRow = -1;

    //取消默认第一个item被选中
    this->setCurrentItem(NULL);
}

/**
 * @brief MyTableWidget::itemChange 鼠标点击item之外空间时,取消之前被选中的item
 */
void MyTableWidget::itemChange()
{
    //鼠标点击item之外空间时
    if(this->selectedItems().size() == 0)
    {
        this->setCurrentItem(NULL);
    }
}

/**
 * @brief MyTableWidget::leaveEvent 鼠标不在table上时,还原之前的背景色
 * @param event
 */
void MyTableWidget::leaveEvent(QEvent *event)
{
    Q_UNUSED(event);

    //还原之前的背景色
    if(m_oldEnteredRow != -1)
    {
        QTableWidgetItem* itemOld;
        itemOld = this->item(m_oldEnteredRow, 0);
        itemOld->setBackgroundColor(Qt::red);

        itemOld = this->item(m_oldEnteredRow, 1);
        itemOld->setBackgroundColor(Qt::red);

        m_oldEnteredRow = -1;
    }
}

/**
 * @brief MyTableWidget::eventFilter 事件过滤器
 * @param obj
 * @param event
 * @return
 */
bool MyTableWidget::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::HoverMove)
    {
        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
        QModelIndex index = this->indexAt(mouseEvent->pos());
        if(index.isValid())  //鼠标悬停在item上
        {
            if(m_oldEnteredRow != index.row())
            {
                //还原之前的背景色
                if(m_oldEnteredRow != -1)
                {
                    QTableWidgetItem* itemOld;
                    itemOld = this->item(m_oldEnteredRow, 0);
                    itemOld->setBackgroundColor(Qt::red);

                    itemOld = this->item(m_oldEnteredRow, 1);
                    itemOld->setBackgroundColor(Qt::red);
                }

                //更改当前行的背景色
                int row = index.row();
                QTableWidgetItem* item;
                item = this->item(row, 1);
                item->setBackgroundColor(Qt::yellow);
                item = this->item(row, 0);
                item->setBackgroundColor(Qt::yellow);

                m_oldEnteredRow = row;
            }
        }
        else //鼠标悬停在item之外
        {
            //还原之前的背景色
            if(m_oldEnteredRow != -1)
            {
                QTableWidgetItem* itemOld;
                itemOld = this->item(m_oldEnteredRow, 0);
                itemOld->setBackgroundColor(Qt::red);

                itemOld = this->item(m_oldEnteredRow, 1);
                itemOld->setBackgroundColor(Qt::red);

                m_oldEnteredRow = -1;
            }
        }
    }

    return QWidget::eventFilter(obj, event);
}

三、类的使用 

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mytablewidget.h"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    MyTableWidget* m_tableWidget;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHBoxLayout>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_tableWidget = new MyTableWidget;

    //添加4行2列数据
    m_tableWidget->setRowCount(4);
    m_tableWidget->setColumnCount(2);
    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 2; j++)
        {
            QTableWidgetItem* item = new QTableWidgetItem;
            item->setText(QString("%1%2").arg(i).arg(j));
            m_tableWidget->setItem(i, j, item);
        }
    }

    //事件过滤器
    this->installEventFilter(m_tableWidget);

    this->setCentralWidget(m_tableWidget);
}

MainWindow::~MainWindow()
{
    delete ui;
}

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

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

相关文章

一页纸吃透PMP常考知识点!

我是胖圆~需要文档可留言 或者移步公众号【胖圆说PM】找我

根据身高重建队列【贪心算法】

根据身高重建队列 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返…

色温曲线坐标轴的选取:G/R、G/B还是R/G、B/G ?

海思色温曲线坐标 Mstar色温曲线坐标 高通色温曲线坐标 联咏色温曲线坐标 查看各家白平衡调试界面&#xff0c;比如海思、Mstart、高通等调试资料&#xff0c;白平衡模块都是以R/G B/G作为坐标系的两个坐标轴&#xff0c;也有方案是以G/R G/B作为坐标系的两个坐标轴。 以G/R G…

考生作弊行为分析算法

考生作弊行为分析系统利用pythonyolo系列网络模型算法框架&#xff0c;考生作弊行为分析算法利用图像处理和智能算法对考生的行为进行分析和识别&#xff0c;经过算法服务器的复杂计算和逻辑判断&#xff0c;算法将根据考生行为的特征和规律&#xff0c;判定是否存在作弊行为。…

Vue中如何为Echarts统计图设置数据

在前端界面接收后端数据后&#xff0c;将数据赋值给ECharts中的data时出现了&#xff0c;数据读取失败的问题&#xff08;可能是由于数据渲染的前后顺序问题&#xff09;。后通过如下方式进行了解决&#xff1a; 1、接下来将介绍UserController中的countUsers方法&#xff0c;…

为什么2G、3G、4G成功了,5G却?

你可能已经多年来一直听到关于闪电般的5G的炒作。虽然新的无线网络在美国仍然没有普及&#xff0c;但5G正在波士顿和西雅图到达拉斯和堪萨斯城等城市慢慢出现。随着连接速度的加快&#xff0c;用户的安全性和隐私保护将增加&#xff0c;因为无线行业试图改善3G和4G的防御。但是…

K8S最新版本集群部署(v1.28) + 容器引擎Docker部署(下)

温故知新 &#x1f4da;第三章 Kubernetes各组件部署&#x1f4d7;安装kubectl&#xff08;可直接跳转到安装kubeadm章节&#xff0c;直接全部安装了&#xff09;&#x1f4d5;下载kubectl安装包&#x1f4d5;执行kubectl安装&#x1f4d5;验证kubectl &#x1f4d7;安装kubead…

文件上传漏洞复现(CVE-2018-2894)

文章目录 搭建环境启动环境漏洞复现 前提条件&#xff1a; 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub 搭建环境 进入vulhb目录下的weblogic&#xff0c;复现CVE-2018-289…

修改linux中tomcat的端口

随便修改一个 以8055为例子 开放8081端口 firewall-cmd --permanent --add-port8081/tcp firewall-cmd --reload firewall-cmd --list-all

three.js(七):内置的二维几何体

二维几何体 PlaneGeometry 矩形平面CircleGeometry 圆形平面RingGeometry 圆环平面 PlaneGeometry 矩形平面 PlaneGeometry(width : Float, height : Float, widthSegments : Integer, heightSegments : Integer) width — 平面沿着X轴的宽度。默认值是1。height — 平面沿着Y…

从格灵深瞳中报稳定盈利,看AI公司的核心竞争力

2023年过半&#xff0c;人工智能产业话题不断。大模型和AIGC掀起热潮&#xff0c;让众多AI公司开始进入新一轮竞赛。但与此同时&#xff0c;不少AI公司依然处于亏损中&#xff0c;研发投入和商业产出难以实现正循环。如何形成健康的商业模式&#xff0c;仍是一大挑战。 AI公司…

【Linux操作系统】文件缓冲区

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ Linux       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1f6f0…

设计模式--代理模式(Proxy Pattern)

一、什么是代理模式&#xff08;Proxy Pattern&#xff09; 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许一个对象&#xff08;代理&#xff09;充当另一个对象&#xff08;真实对象&#xff09;的接口&#xff0c;以控制对该对象的…

DSP_TMS320F28377D_算法加速方法2_添加浮点运算快速补充库rts2800_fpu32_fast_supplement.lib

继上一篇博客DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行_江湖上都叫我秋博的博客-CSDN博客之后&#xff0c;本文讲第二种DSP算法加速的方法&#xff0c;该方法的加速效果很明显&#xff0c;但是加速范围仅限于32位浮点数下面这几种函数: 1 工程师的关注点 下面稍微解…

CentOS8安装mysql8.0.24

一、下载mysql安装包并解压 执行以下命令&#xff1a; # 创建mysql安装目录 mkdir /usr/local/mysql # 进入mysql安装目录 cd /usr/local/mysql/ # 下载mysql-8.0.24 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz # 解压…

防静电出入门禁管理系统的功能和特点

防静电出入门禁管理系统是一种应用于电子设备生产、仓储物流等领域的门禁系统&#xff0c;旨在防止静电对于设备和产品的损害和干扰。该系统主要包括以下几个方面的功能和特点&#xff1a; 1. 门禁控制功能&#xff1a;通过在入口设置读卡器或生物识别设备&#xff08;如指纹、…

Java处理 CDT时区转换CST时区

例如&#xff1a;夏令营时间&#xff08;“Sat Aug 01 00:00:00 CDT 1987”&#xff09; //TODO CDT时区转换CST时区Date date new Date(value);TimeZone cdtTZ TimeZone.getTimeZone("America/Chicago");TimeZone cstTZ TimeZone.getTimeZone("America/Mexi…

SQL server数据库-定制查询-指定查询列/行、结果排序和Like模糊查询

本篇讲述进阶查询方法&#xff0c;如有语句不明确&#xff0c;可跳转本文专栏学习基础语法 1、指定列查询 特点 只会显示你输入的列的数据&#xff0c;会根据你输入的顺序进行显示&#xff0c;可以自定义查询显示时的列名 &#xff08;1&#xff09;只会显示你输入的列的数…

解析msvcp100.dll丢失的原因及修复方法,教你快速解决的方案

msvcp100.dll文件的丢失&#xff0c;其实也是属于dll丢失的其中一种&#xff0c;因为它是dll文件&#xff0c;大家记住&#xff0c;只要是后缀是dll的文件那么它就是dll文件&#xff0c;只要丢失了dll文件&#xff0c;那么其解决的方法都是大同小异的&#xff0c;唯一不同的是&…