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

一、最终效果
 

二、 重写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;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt实现点击`QTableWidget`的单元格时,整行高亮显示,你可以使用`QTableWidget`的信号和槽机制来实现。 以下是一个示例代码,演示了如何在点击`QTableWidget`的单元格时,整行高亮显示: ```cpp // 假设有一个名为tableWidget的QTableWidget对象 // 设置整行选择模式 tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); // 连接单元格点击信号与槽函数 connect(tableWidget, &QTableWidget::cellClicked, [=](int row, int column) { // 清除之前的选择 tableWidget->clearSelection(); // 设置当前行为选中状态 tableWidget->selectRow(row); }); ``` 在上述示例中,我们首先调用`setSelectionBehavior()`函数将`QTableWidget`的选择模式设置为整行选择模式(`QAbstractItemView::SelectRows`)。这样设置后,当我们选择一个单元格时,整行都会被选中。 然后,我们使用`connect()`函数将`QTableWidget`的`cellClicked`信号连接到一个匿名的lambda槽函数上。该槽函数会在单元格被点击时被触发。在槽函数中,我们首先调用`clearSelection()`函数来清除之前的选择。然后,使用`selectRow()`函数将当前行设置为选中状态。 通过这种方式,当你点击`QTableWidget`的单元格时,整行会被高亮显示。 请注意,示例中的`tableWidget`应替换为你实际使用的`QTableWidget`对象。 你可以根据需要进一步自定义选中行的样式,例如更改选中行的背景色等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值