简体   繁体   中英

How to draw in the painter of a QHeaderView?

In my code below, qDebug() inside of the paintSection is being called, however, the QPixmap is not being drawn into the header column.

Reproducible example:

class HeaderView : public QHeaderView
{
    Q_OBJECT

public:

    HeaderView(Qt::Orientation orientation, QWidget *parent = nullptr)
        : QHeaderView(orientation, parent)
    {
    }

    QPixmap pixmap = QPixmap(":/files/icon.png");

    void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const override
    {
        switch (logicalIndex) 
        {
            case 0:
            {
                painter->drawPixmap(rect.x(), rect.y(), rect.width(), rect.height()
                    , pixmap);

                //painter->fillRect(rect, QColor(255, 255, 255));
                qDebug() << rect;
                break;
            }
            default:
                break;
        }

        QHeaderView::paintSection(painter, rect, logicalIndex);
    }
};



class TreeView : public QTreeView
{
    Q_OBJECT

public:

    QStandardItemModel model;
    HeaderView* headerView;

    TreeView(QWidget* parent = 0) : QTreeView(parent)
    {
        setModel(&model);

        setIndentation(0);
        setUniformRowHeights(true);
        setRootIsDecorated(false);
        setSortingEnabled(true);

        headerView = new HeaderView(Qt::Horizontal);
        setHeader(headerView);

        model.setHorizontalHeaderItem(0, new QStandardItem("column0"));
        model.setHorizontalHeaderItem(1, new QStandardItem("column1"));
        model.setHorizontalHeaderItem(2, new QStandardItem("column2"));

        header()->setDefaultAlignment(Qt::AlignCenter);
        header()->setMinimumSectionSize(100);
    }
};

#include "treeview.h"

Application::Application(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);   
    TreeView* treeView = new TreeView(this);
}

While searching about, I found that the painter needs to be saved/restored to make it work:

void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const override
{
    painter->save();
    QHeaderView::paintSection(painter, rect, logicalIndex);
    painter->restore();

    switch (logicalIndex) 
    {
        case 0:
        {
            painter->drawPixmap(rect, pixmap);
            break;
        }
        default:
            break;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM