QTreeWidget 设置任意行背景色

设置任意某行,网上这类示例少,一般都是选中行、交替行、高亮行等设置。

比如我要将顶层节点的背景色修改一下。

方法1,先继承QTreeWidget,更改它的 drawBranches函数,在里面添加条件判断,然后根据需要设置颜色。

#ifndef TREEWIDGET_H
#define TREEWIDGET_H
#include <QTreeWidget>
#include <QObject>
class TreeWidget : public QTreeWidget
{
    Q_OBJECT
public:
    explicit TreeWidget(QWidget *parent = nullptr);
protected:
    virtual void drawBranches(QPainter *painter,
                                  const QRect &rect,
                                  const QModelIndex &index) const;
};
#endif // TREEWIDGET_H
#include "treewidget.h"
#include <QPainter>
#include <QtDebug>
TreeWidget::TreeWidget(QWidget *parent): QTreeWidget(parent)
{
}
void TreeWidget::drawBranches(QPainter *painter,
                               const QRect &rect,
                               const QModelIndex &index) const
{
    auto item = this->itemFromIndex(index);
    if (item->parent() == nullptr)		//某种条件
    {
        painter->fillRect(rect.x(), rect.y(), rect.width(), rect.height(), QColor(46,146,46));
    }
    QTreeView::drawBranches(painter, rect, index);
}

在使用时,在添加顶层行时,设置颜色,注意跟 drawBranches里面的颜色相同。

...
QStringList itemNameList0;
itemNameList0 << QString(tr("Tester"));
QTreeWidgetItem *topLevelItem0 = new QTreeWidgetItem(ui->treeWidget, itemNameList0);
QBrush brushColor(QColor(46, 146, 46));
topLevelItem0->setBackground(0, brushColor);
ui->treeWidget->addTopLevelItem(topLevelItem0);

如图。

缺点是在添加行的时后,需要手动再设置一次颜色item-> setBackground(),否则只有前面的地方显示背景色。

在动态添加窗体条目的情况下,添加时设置一下即可,这时缺点可以忽略。

方法2

上面的方法还是有点不太方便,最好只设置一次。做一些修改。

void TreeWidget::drawRow(QPainter *painter,
                     const QStyleOptionViewItem &options,
                     const QModelIndex &index) const
{
    auto item = this->itemFromIndex(index);
    if (item->parent() == nullptr)
    {
        painter->fillRect(options.rect.x(), options.rect.y(), options.rect.width(), options.rect.height(), QColor(46,146,146));
    }
    QTreeView::drawRow(painter, options, index);
}

在使用时,不用设置颜色,

...
    QStringList itemNameList0;
    itemNameList0 << QString(tr("Tester"));
    QTreeWidgetItem *topLevelItem0 = new QTreeWidgetItem(ui->treeWidget, itemNameList0);
    ui→treeWidget→addTopLevelItem(topLevelItem0);
如图,这比方法1更省劲。

条件是根据需要来修改的,加工一下,可以设置任意行的颜色。

设置top level任意行颜色:

#ifndef TREEWIDGET_H
#define TREEWIDGET_H
#include <QTreeWidget>
#include <QObject>
class TreeWidget : public QTreeWidget
{
    Q_OBJECT
public:
    explicit TreeWidget(QWidget *parent = nullptr);
    void SetLineBKColor(int row, QColor color);
protected:
    virtual void drawRow(QPainter *painter,
                         const QStyleOptionViewItem &options,
                         const QModelIndex &index) const;
private:
    QColor m_pConditionColor;
    int m_row;
};
#endif // TREEWIDGET_H
#include "treewidget.h"
#include <QPainter>
#include <QtDebug>
TreeWidget::TreeWidget(QWidget *parent): QTreeWidget(parent)
{
    m_row = -1;
}
void TreeWidget::SetLineBKColor(int row, QColor color)
{
    m_row = row;
    m_pConditionColor = color;
}
void TreeWidget::drawRow(QPainter *painter,
                     const QStyleOptionViewItem &options,
                     const QModelIndex &index) const
{
    if (index.row() == m_row)
    {
        painter->fillRect(options.rect.x(), options.rect.y(), options.rect.width(), options.rect.height(), m_pConditionColor);
    }
    QTreeView::drawRow(painter, options, index);
}
使用时
	...
    QStringList itemNameList0;
    itemNameList0 << QString(tr("Tester"));
    QTreeWidgetItem *topLevelItem0 = new QTreeWidgetItem(ui->treeWidget, itemNameList0);
    ui→treeWidget→addTopLevelItem(topLevelItem0);

    ui->treeWidget->SetLineBKColor(1, Qt::lightGray);

其他条件根据自己的需求修改。

原创求赞

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值