Как узнать ширину текста заголовка в QStyle? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть QTreeView, и я использую ProxyStyle для этого.

enter image description here

Рисунок выше - просто заголовок.Теперь мне нужно нарисовать стрелку вверх / вниз (для сортировки элементов) рядом с меткой заголовка, как на рисунке.Чтобы поставить стрелку в правильном положении, мне нужно знать:

  • левое поле = расстояние между текстом и левой границей
  • ширина текста
  • правое поле = расстояние между текстом и стрелкой

Как рассчитать ширину текста в этом случае?Я думал о QFontMetrics, но не знаю, как получить текст для расчета.

В моем стиле я использую только drawPrimitive функцию

void MyStyle::drawPrimitive( PrimitiveElement p_pe, const QStyleOption *p_option, QPainter *p_painter, const QWidget *p_widget ) const
{
  int leftmargin = 10;
  int rightmargin = 10;
  if ( p_pe == PE_IndicatorHeaderArrow )
  {
     if ( const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>( p_option ) )
     {
        QPixmap pix;
        if ( header->sortIndicator & QStyleOptionHeader::SortUp )
        {
           pix = QPixmap( ":/sortUp.png" );
        }
        else if ( header->sortIndicator & QStyleOptionHeader::SortDown )
        {
           pix = QPixmap( ":/sortDown.png" );
        }
        p_painter->drawPixmap( header->rect.left() + leftmargin+ subElementRect( SE_HeaderLabel, p_option, p_widget ).width() + rightmargin, header->rect.top() + pix.height(), pix );
     }
  }
  else
  {
     QProxyStyle::drawPrimitive( p_pe, p_option, p_painter, p_widget );
  }
}

Я использую subElementRect( SE_HeaderLabel, p_option, p_widget ).width() в этом случае, но этонеправильно.Как я могу рассчитать ширину текста?

1 Ответ

0 голосов
/ 17 октября 2018

Все это содержится в QStyleOptionHeader.Ширина текста может быть получена путем вызова:

int textWidth = header->fontMetrics.boundingRect(header->text).width();
...