我是靠谱客的博主 飞快星星,最近开发中收集的这篇文章主要介绍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);

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

原创求赞

最后

以上就是飞快星星为你收集整理的QTreeWidget 设置任意行背景色的全部内容,希望文章能够帮你解决QTreeWidget 设置任意行背景色所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部