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

来源:互联网 发布:死亡扳机2机枪 mac 编辑:程序博客网 时间:2024/06/08 02:49

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_OBJECTpublic:    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);       }}

效果图如下:
这里写图片描述
这里写图片描述
这里写图片描述

脚注

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

阅读全文
0 0