Search code examples
qtcolorsqtreewidgetalternatealternating

How to alternate empty space color in QTreeWidget?


If I type this code

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

colors of rows are interleaves. But if a QTreeWidget is not full there is an empty space which has green color. Is there a posibility to brush this space with red when the last row is green?

P.S.

#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


Solution

  • I have tried to redefine the drawRow of the QTreeWidget.

    It working quite well but is it a good practice?

    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);
    }