首页 > 解决方案 > 子类化 QHeaderView 时排序箭头消失

问题描述

我将 QHeaderView 子类化以在 QTableView 的水平标题中添加过滤图标。QTableView 使用 QSortFilterProxyModel 激活了排序功能,直到现在它工作正常。但是,当我尝试继承 QHeaderView 并将其用作列标题时,只有第一列显示过滤器图标。

headerview_filter.h

#ifndef HEADERVIEW_FILTER_H
#define HEADERVIEW_FILTER_H

#include <QHeaderView>

class HeaderView_Filter : public QHeaderView
{
Q_OBJECT
public:
   explicit HeaderView_Filter(Qt::Orientation orientation, QWidget * parent = nullptr);
   void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const override;

private:
   const QPolygonF _funel = QPolygonF({{22.0,36.0},{22.0,22.0},{10.0,10.0},{40.0,10.0},{28.0,22.0},{28.0,36.0}});
};

#endif // HEADERVIEW_FILTER_H

headerview_filter.cpp

#include "headerview_filter.h"

HeaderView_Filter::HeaderView_Filter(Qt::Orientation orientation, QWidget * parent)
: QHeaderView(orientation, parent)
{
   setSectionsClickable(true);
}

void HeaderView_Filter::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
   painter->save();
   QHeaderView::paintSection(painter, rect, logicalIndex);
   painter->restore();
   const double scale = 0.6*rect.height()/50.0;
   painter->setBrush(Qt::black);
   painter->translate(0,5);
   painter->scale(scale, scale);
   painter->drawPolygon(_funel);
   painter->restore();
}

以形式使用它:

auto* tableView = _ui->tableView_Data;    
tableView->setModel(_sortFilterProxyModel);
tableView->setSortingEnabled(true);
tableView->setHorizontalHeader(new HeaderView_Filter(Qt::Horizontal,tableView));

标签: c++qt5qtableviewqheaderview

解决方案


我在键入时找到了解决方案,并更愿意发布代码供其他人使用。绘图的位置必须相对于作为 paintSection 参数提供的绘图矩形进行平移:

void HeaderView_Filter::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
   painter->save();
   QHeaderView::paintSection(painter, rect, logicalIndex);
   painter->restore();
   const double scale = 0.6*rect.height()/50.0;
   painter->setBrush(Qt::black);
   // Here
   painter->translate(rect.x(),rect.y()+5);
   //
   painter->scale(scale, scale);
   painter->drawPolygon(_funel);
   painter->restore();
}

推荐阅读