samedi 4 mars 2017

Adding a header to a QListView

I encountered a little problem with QListView. I wanted to add a header to this object. However, I found no method to do such a task. I have seen several posts on SO and Qt forums but did not found anything relevant to my needs. I remembered that, in the past, I have used something that could be adapted to QListView (I think it was inspired by a Qt example but do not remember which one).

For those who need to display a header on the top of the QListView, I will post the code here. If someone find something false, or unadapted, please let me know. Here is the code:

Header

class MainMenuListView : public QListView
{
    Q_OBJECT

    class Header : public QWidget
    {
    public:
        Header(MainMenuListView* parent);
        QSize sizeHint() const;

    protected:
        void paintEvent(QPaintEvent* event);

    private:
        MainMenuListView* menu;
    };

public:
    MainMenuListView(QWidget* parent = nullptr, const QString& header = QString("Header"));

    void headerAreaPaintEvent(QPaintEvent *event);
    int headerAreaWidth();

protected:
     void resizeEvent(QResizeEvent* event);

private:
    QWidget*    headerArea;
    QString     headerText;
};

Implementation

MainMenuListView::Header::Header(MainMenuListView* parent) : QWidget(parent), menu(parent) {}

QSize MainMenuListView::Header::sizeHint() const
{
    return QSize(menu->headerAreaWidth(), fontMetrics().height());
}

void MainMenuListView::Header::paintEvent(QPaintEvent* event)
{
    menu->headerAreaPaintEvent(event);
}

MainMenuListView::MainMenuListView(QWidget* parent, const QString& header) : QListView(parent), headerText(header)
{
    headerArea = new Header(this);
    setViewportMargins(0, fontMetrics().height(), 0, 0);
}

void MainMenuListView::headerAreaPaintEvent(QPaintEvent* event)
{
    QPainter painter(headerArea);
    painter.fillRect(event->rect(), Qt::lightGray);

    painter.setPen(Qt::black);
    painter.drawText(0, 0, headerArea->width(), fontMetrics().height(), Qt::AlignCenter, headerText);
}

int MainMenuListView::headerAreaWidth()
{
    return width();
}

void MainMenuListView::resizeEvent(QResizeEvent* event)
{
    QListView::resizeEvent(event);
    headerArea->adjustSize();
}

Tested and working under Debian Qt5.x.x

Result:

Sample result

Aucun commentaire:

Enregistrer un commentaire