【问题标题】:Sort Arrows Disappear When Subclassing QHeaderView子类化 QHeaderView 时排序箭头消失
【发布时间】:2021-09-21 03:27:08
【问题描述】:

我正在继承 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++ qt5 qtableview qheaderview


    【解决方案1】:

    我在键入时找到了解决方案,并希望将代码发布给其他人使用。 绘图的位置必须相对于作为 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 2014-05-27
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多