QTableWidget实现鼠标移动整行颜色变化

QTableWidget实现鼠标移动整行颜色变化

困扰了本人很久的一个问题就是QTableWidget的qss样式只能提供每个item:hover时的样式变化,而我们想要实现的是一整行的样式变化,在不断的坚持下今天终于解决了,今天写下来方便大家查阅,希望能够帮到大家。

  • *主要的方法就是新建一个新类继承自QTableWidget,我这里的类名为SWTableWidget,然后在头文件和源文件中填写代码,之后在ui设计中拖入一个QTableWidget控件,再将该控件提升为我们新建的类SWTableWidget,具体步骤我在这里就不啰嗦啦,下面直接看代码

代码块

#ifndef SWTABLEWIDGET_H
#define SWTABLEWIDGET_H

#include 
#include 
#include 

class SWTableWidget : public QTableWidget
{
    Q_OBJECT
public:
    explicit SWTableWidget(QWidget *parent = nullptr);
protected:
    void leaveEvent(QEvent *event);//鼠标移出事件
public slots:
    void cellEntered(int,int);//鼠标移动事件,返回item的行和列号
private:
    QColor lastRowBkColor;//存储item之前的颜色,这里是透明的,默认设置为透明
    int previousColorRow;// 鼠标移动过的上一行的行号
    void setRowColor(int,QColor);
};

#endif // SWTABLEWIDGET_H

代码块语法遵循标准markdown代码,例如:

#include "swtablewidget.h"
#include 
#include 

SWTableWidget::SWTableWidget(QWidget *parent) : QTableWidget(parent)
{
    this->setMouseTracking(true);//设置可捕获鼠标移动事件,很重要
    lastRowBkColor = QColor(0x00,0xff,0x00,0x00);//透明颜色
    previousColorRow = -1;

/*******************本段代码只是测试用,真正使用时需注释掉********************************/
    this->setRowCount(10);   //设置行数为10
    this->setColumnCount(5); //设置列数为5

    for(int i = 0; i < 10; i ++)
    {
        for(int j = 0; j < 5; j ++)
        {
            QTableWidgetItem *item = new QTableWidgetItem();
            this->setItem(i,j,item);
        }
    }
/*******************本段代码只是测试用,真正使用时需注释掉********************************/

    this->setSelectionBehavior(QAbstractItemView::SelectRows);   //设置整行选择
    //this->setStyleSheet("selection-background-color:rgba(0,0,0,50)");  //设置选中行颜色
    this->setEditTriggers(QAbstractItemView::NoEditTriggers);    //禁止编辑表格
    connect(this,SIGNAL(cellEntered(int,int)),this,SLOT(cellEntered(int,int)));
}

void SWTableWidget::leaveEvent(QEvent *event)
{
    QTableWidgetItem *item = 0;

    //还原上一行的颜色
    item = this->item(previousColorRow, 0);
    if (item != 0)
    {
        this->setRowColor(previousColorRow, lastRowBkColor);
    }
}

void SWTableWidget::cellEntered(int row, int column)
{
    QTableWidgetItem *item = 0;

    //还原上一行的颜色
    item = this->item(previousColorRow, 0);
    if (item != 0)
    {
        this->setRowColor(previousColorRow, lastRowBkColor);
    }

    //设置当前行的颜色
    item = this->item(row, column);
    if (item != 0 && !item->isSelected())
    {
        this->setRowColor(row, QColor(193,210,240));
    }

    //设置行的索引
    previousColorRow = row;
}

void SWTableWidget::setRowColor(int row, QColor color)
{
    for (int col=0; colcolumnCount(); col++)
       {
           QTableWidgetItem *item = this->item(row, col);
           item->setBackgroundColor(color);
       }
}

效果图如下:
QTableWidget实现鼠标移动整行颜色变化_第1张图片
QTableWidget实现鼠标移动整行颜色变化_第2张图片
QTableWidget实现鼠标移动整行颜色变化_第3张图片

脚注

本示例参考其他博友的博客,由本人能力有限,如有错误的地方请多多指教
注:本博客未经博主允许,请不要转载

你可能感兴趣的:(QT)