您的位置:首页 > 编程语言 > Qt开发

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

2017-11-27 10:38 423 查看

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

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

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

代码块

#ifndef SWTABLEWIDGET_H
#define SWTABLEWIDGET_H

#include <QWidget>
#include <QTableWidget>
#include <QColor>

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 <QDebug>
#include <QMouseEvent>

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; col<this->columnCount(); col++)
{
QTableWidgetItem *item = this->item(row, col);
item->setBackgroundColor(color);
}
}


效果图如下:







脚注

本示例参考其他博友的博客,由本人能力有限,如有错误的地方请多多指教

注:本博客未经博主允许,请不要转载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Qt QTableWidg 样式 整行