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

目录

    • 原理
    • 方法一代码
    • 方法一效果图
    • 方法二代码
    • 方法二效果图
    • 源码下载链接

原理

方法一:自定义一个继承于QStyledItemDelegate的子类,重写paint函数。对处于hover状态的item及那一行的每一个item进行绘制即可。这样的好处时可以通过stylesheet来控制hover状态的颜色。
方法二:直接使用QTreeWidget,因为QTreeWidget鼠标移动时整行颜色都可以变化,在通过设置item的样式表以及QTreeWidget的一些设置最后可以做到和QtableWidget差不多的效果。

方法一代码

1.先设置QTableWidget的样式表

QTableView::item:hover{
	background-color:#ff0000;
}
QTableView::item:selected{
	background-color:#0078D7;
}
QTableView::item:selected:!active{
	background-color:#f0f0f2;
}

myItemDelegate.h

#ifndef MYITEMDELEGATE_H
#define MYITEMDELEGATE_H

#include 
#include 
#include 

class myItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit myItemDelegate(QTableWidget *tableWidget, QObject *parent = nullptr);
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;

signals:

public slots:
private:
    //指明被代理的tablewidget,方便获取整行的item
    QTableWidget *m_tableWidget;
};

#endif // MYITEMDELEGATE_H

myItemDelegate.cpp

#include "myitemdelegate.h"

myItemDelegate::myItemDelegate(QTableWidget *tableWidget, QObject *parent) :
    QStyledItemDelegate(parent),
    m_tableWidget(tableWidget)
{

}

void myItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(option.state.testFlag(QStyle::State_MouseOver))
    {
        QTableWidgetItem *hoverItem = m_tableWidget->item(index.row(), index.column());
        if(hoverItem != nullptr)
        {
            int row = hoverItem->row();
            int columnCount = m_tableWidget->columnCount();
            for(int i = 0; i < columnCount; i++)
            {
                QTableWidgetItem *item = m_tableWidget->item(row, i);
                if(item != nullptr)
                {
                    QModelIndex index = m_tableWidget->model()->index(row, i);
                    QStyleOptionViewItem op = option;
                    op.index = index;
                    //获取每个item对应的可视矩形
                    op.rect = m_tableWidget->visualItemRect(item);
                    QStyledItemDelegate::paint(painter, op, index);
                }
            }
        }
        return;
    }
    return QStyledItemDelegate::paint(painter, option, index);
}

应用

    myItemDelegate *delegate = new myItemDelegate(ui->tableWidget);
    ui->tableWidget->setItemDelegate(delegate);

方法一效果图

QTableWidget实现鼠标移动整行颜色变化_第1张图片

方法二代码

QTreeWidget的样式表

QTreeView{
	outline:none;/*去除选中后的虚线*/
}
QTreeView::item{
	padding:10px;/*设置item的高度*/
/*以下设置item的边框,默认是QTreeWidgetItem无边框的,而QTableWidgetItem是有边框的*/
	border-top:0.5px solid lightgray;
	border-left:0.5px solid lightgray;
	border-bottom:0.5px solid lightgray;
}
QTreeView::item:hover{
	background-color:#ff0000;
}
QTreeView::item:selected{
	background-color:#0078D7;
}
QTreeView::item:selected:!active{
	background-color:#f0f0f2;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    ui->treeWidget->setHeaderLabels(QStringList() << QStringLiteral("姓名") << QStringLiteral("年龄"));
    //设置表头文字居中
    ui->treeWidget->header()->setDefaultAlignment(Qt::AlignCenter);

    QTreeWidgetItem *item0 = new QTreeWidgetItem(QStringList() << QStringLiteral("小明") << QStringLiteral("18"));
    QTreeWidgetItem *item1 = new QTreeWidgetItem(QStringList() << QStringLiteral("杰哥") << QStringLiteral("19"));

    //去除掉顶层节点下的子节点的rect不能铺满的情况
    ui->treeWidget->setRootIsDecorated(false);

    ui->treeWidget->addTopLevelItem(item0);
    ui->treeWidget->addTopLevelItem(item1);
}

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

方法二效果图

QTableWidget实现鼠标移动整行颜色变化_第2张图片

源码下载链接

方法二代码下载treeWidgetTest1 路径(/treeWidgetTest1)

你可能感兴趣的:(我的QT,qt,qt5)