设置任意某行,网上这类示例少,一般都是选中行、交替行、高亮行等设置。
比如我要将顶层节点的背景色修改一下。
方法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);
其他条件根据自己的需求修改。
原创求赞