Как чередовать цвет пустого пространства в QTreeWidget? - PullRequest
0 голосов
/ 15 апреля 2019

Если я наберу этот код

myTree->setAlternatingRowColors(true);
myTree->setStyleSheet("QTreeWidget{alternate-background-color: red;background: green;}");

цвета строк чередуются.Но если QTreeWidget не заполнен, есть пустое пространство зеленого цвета.Есть ли возможность закрасить это пространство красным, когда последний ряд зелёный?

PS

#include <QApplication>
#include <QWidget>
#include <QTreeWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget *mainWidget = new QWidget();
    mainWidget->resize(200,100);
    QTreeWidget *myTree = new QTreeWidget(mainWidget);
    myTree->resize(200,100);

    QTreeWidgetItem *newTreeItem;
    newTreeItem = new QTreeWidgetItem(myTree);
    newTreeItem->setText(0,"leaf_01");
    newTreeItem = new QTreeWidgetItem(myTree);
    newTreeItem->setText(0,"node_02");
    newTreeItem = new QTreeWidgetItem(newTreeItem);
    newTreeItem->setText(0,"leaf_03");

    myTree->setAlternatingRowColors(true);
    myTree->setStyleSheet("QTreeWidget{alternate-background-color: red; background: green;}");

    mainWidget->show();

    return a.exec();
}

enter image description here

1 Ответ

0 голосов
/ 16 апреля 2019

Я попытался переопределить drawRow QTreeWidget.

Это работает довольно хорошо, но это хорошая практика?

void myTreeWidget::drawRow(QPainter *p, const QStyleOptionViewItem &opt, const QModelIndex &idx) const
{   
    if(itemFromIndex(idx)) {
        if(!itemBelow(itemFromIndex(idx))) {

            int counter = 0;
            QTreeWidgetItem *currentItem = topLevelItem(0);
            if(currentItem) {
                while(itemBelow(currentItem)) {
                    currentItem=itemBelow(currentItem);
                    counter = counter + 1;
                }
            }

            if(counter % 2) {
                p->setBrush(oddColor);
            } else {                
                p->setBrush(evenColor);
            }

            QRect itemRect = visualRect(idx);
            QRect emptySpace = this->rect();
            emptySpace.setTop(itemRect.y()+itemRect.height());
            p->setPen(Qt::transparent);
            p->drawRect(emptySpace);
        }
    }

    QTreeWidget::drawRow(p, opt, idx);
}
...