如何使用委托在QHeaderView部分绘制像素图?

时间:2012-05-04 12:01:21

标签: qt delegates qt4 qheaderview

问题:我需要将小像素图绘制到QHeaderView部分,如此图所示(位于该部分右角的像素图,标有红色方块):

enter image description here

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

  1. 重新实现QHeaderView的{​​{1}}方法。

  2. paintSection()班级创建代理并重新实施QStyledItemDelegate方法。

  3. 如果我尝试使用下面的代码(1)变体, filter pixmap 根本不显示:

    paint()

    (2)变体是这样的:

    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 );
              }
         }
    }
    

    已创建委托,但函数未启动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 ) ); } 方法!

    有任何帮助吗?

    谢谢!

1 个答案:

答案 0 :(得分:7)

现在似乎不可能。

来自Qt文档:

注意:每个标头都会为每个部分本身呈现数据,而不依赖于委托。因此,调用标头的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;
};