qt - 如何使用委托(delegate)在 QHeaderView 部分中绘制像素图?

标签 qt delegates qt4 qheaderview

问题 : 我需要画小像素图到QHeaderView如图所示的部分(像素图位于该部分的右上角,用红色方 block 标记):

enter image description here

据我了解,有两种方法可以做到这一点:

  • 重新实现 QHeaderViewpaintSection()方法。
  • QStyledItemDelegate 创建一个委托(delegate)类和重新实现 paint()方法。

  • 如果我尝试使用以下代码的 (1) 变体,则根本不显示过滤器像素图:
    void DecorativeHeaderView::paintSection( QPainter* painter, const QRect& rect, int logicalIndex ) const
    {
         if( !rect.isValid() )
         {
              return;
         }
    
         // get the state of the section
         QStyleOptionHeader option;
         initStyleOption( &option );
    
         // setup the style options structure
         option.rect = rect;
         option.section = logicalIndex;
         option.iconAlignment = Qt::AlignVCenter | Qt::AlignHCenter;
    
         QVariant variant = model()->headerData( logicalIndex, orientation(), Qt::DecorationRole );
         option.icon = qvariant_cast< QIcon >( variant );
         if( option.icon.isNull() )
         {
              option.icon = qvariant_cast< QPixmap >( variant );
         }
    
         // draw the section
         if( !option.icon.isNull() )
         {
              style()->drawControl( QStyle::CE_Header, &option, painter, this );
         }
         else
         {
              QHeaderView::paintSection( painter, rect, logicalIndex );
    
    // HERE is where I'm trying to draw my filter picture!!!
    
              if( logicalIndex == filteredLogicalIndex_ )
              {
                   QPixmap pixmap( ":/spreadsheet/images/spreadsheet/filter_icon_table.png" );
                   int x = rect.right() - pixmap.width();
                   int y = rect.top() + ( rect.height() - pixmap.height() ) / 2;
    
                   painter->drawPixmap( QPoint( x, y ), pixmap );
              }
         }
    }
    

    (2) 变体是这样的:
    class HeaderDelegate : public QStyledItemDelegate
    {
         Q_OBJECT
         Q_DISABLE_COPY( HeaderDelegate )
    
    public:
         HeaderDelegate( QObject* parent = 0 ) : QStyledItemDelegate( parent ) {}
         virtual ~HeaderDelegate() {}
    
         virtual void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const;
    
    }; // HeaderDelegate
    
    void HeaderDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
    {
    
    // THIS method never starts!!!
    
         if( index.column() == 2 )
         {
              QPixmap pixmap( ":/spreadsheet/images/spreadsheet/filter_icon_table.png" );
              int x = option.rect.right() - pixmap.width();
              int y = option.rect.top() + ( option.rect.height() - pixmap.height() ) / 2;
    
              painter->save();
              painter->drawPixmap( QPoint( x, y ), pixmap );
              painter->restore();
         }
    
         QStyledItemDelegate::paint( painter, option, index );
    }
    
    DecorativeHeaderView::DecorativeHeaderView( Qt::Orientation orientation, QWidget* parent /* = 0 */ )
         : QHeaderView( orientation, parent )
         , filteredLogicalIndex_( -1 )
    {
         setItemDelegate( new HeaderDelegate( this ) );
    }
    

    委托(delegate)已创建,但函数未启动 paint()方法!

    有什么帮助吗?

    谢谢!

    最佳答案

    看来目前是不可能的了。

    来自 Qt 文档:

    注意:每个 header 都为每个部分本身呈现数据,并且不依赖于委托(delegate)。因此,调用 header 的 setItemDelegate() 函数将不起作用。

    How to have dynamic pixmap in a QHeaderView item

    但是您可以覆盖 QHeaderView::paintSection 方法。
    subclassing-QHeaderView

    class HeaderView : public QHeaderView {
        Q_OBJECT
    
    public:
        HeaderView(Qt::Orientation orientation, QWidget * parent = 0)
            : QHeaderView(orientation, parent), p("333222.jpeg") {
        }
    
        int sectionSizeHint ( int /*logicalIndex*/ ) const { return p.width(); }
    
    protected:
        void paintSection(QPainter * painter, const QRect & rect, int /*logicalIndex*/) const {
            painter->drawPixmap(rect, p);
        }
    
    private:
        QPixmap p;
    };
    

    关于qt - 如何使用委托(delegate)在 QHeaderView 部分中绘制像素图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10448469/

    相关文章:

    c++ - 如何使用 QLineEdit 将 QString 添加到 QListView

    c# - window.external.notify 传递字符串以外的数据

    python - 如何访问 QTextDocument 页面

    qt4 - QT 4.5 - 更改 QGraphicsItem 的选择选取框

    c++ - 如何在 Linux Mint 中使用 Code::Blocks 让 Qt4 工作

    qt - 如何在 Qt TableView 中实现类似过滤的电子表格?

    Qt:使用拖放重新排序 ListView 项目

    ios - 如何在 ViewController 之间传递 UIButton 的框架和原点

    qt - 连接丢失时未检测到 QNetworkReply 错误信号

    ios - 在 Swift 委托(delegate)中保留循环