Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: andrew.k от Март 27, 2012, 15:53



Название: Custom Widget со стилями
Отправлено: andrew.k от Март 27, 2012, 15:53
Задача. На кнопке (QToolButton) будет выводиться надпись, например, такая:
" Call
 $1.50"
В две строки.
Нужно вместо значка "$" выводить некоторый пиксмап (символ валюты).
Суть проблемы составляет то, что для этой кнопки используются стили. И кнопка должна быть отрисована с учетом этих стилей, задаваемых извне.

В итоге получился такой код.
Код
C++ (Qt)
   QStylePainter painter(this);
 
   QStyleOptionToolButton opt;
   initStyleOption(&opt);
   opt.text = QString();
 
   painter.drawComplexControl(QStyle::CC_ToolButton,opt);
 
   QString val = pixmap_.isNull() ? value_ : value_.replace("$","   ");
   opt.text = QString("%1\n%2").arg(name_).arg(val);
   painter.drawControl(QStyle::CE_ToolButtonLabel,opt);
   if(!pixmap_.isNull())
   {
       int shiftX = 0, shiftY = 0;
       if (opt.state & (QStyle::State_Sunken | QStyle::State_On)) {
           shiftX = style()->pixelMetric(QStyle::PM_ButtonShiftHorizontal, &opt, this);
           shiftY = style()->pixelMetric(QStyle::PM_ButtonShiftVertical, &opt, this);
       }
       int X = (width() - opt.fontMetrics.width(val)) / 2;
       painter.drawPixmap(X + shiftX - 2, height() / 2 + 6 + shiftY,pixmap_);
   }
Он кривоват в плане нахождения позиции отрисовки значка.
Т.к. для отрисовки текста использую painter.drawControl(QStyle::CE_ToolButtonLabel,opt);
то сложно определить как он отрисует.
Поэтому хотелось бы функцию, которая бы рисовала одну строчку по заданным координатам с текущим стилем.
Т.е. чтобы результат был как у этой строчки.

Примеры, советы приветствуются.


Название: Re: Custom Widget со стилями
Отправлено: GreatSnake от Март 27, 2012, 17:20
Сам не пробовал, но может поможет)
Идея задействовать rich-text. Создай QTextDocument и вместо
Код
C++ (Qt)
painter.drawControl(QStyle::CE_ToolButtonLabel,opt);
вызывай
Код
C++ (Qt)
QTextDocument::drawContents( &p, opt.text )


Название: Re: Custom Widget со стилями
Отправлено: andrew.k от Март 27, 2012, 17:37
Сам не пробовал, но может поможет)
Идея задействовать rich-text. Создай QTextDocument и вместо
Код
C++ (Qt)
painter.drawControl(QStyle::CE_ToolButtonLabel,opt);
вызывай
Код
C++ (Qt)
QTextDocument::drawContents( &p, opt.text )
В этом случае потеряется стиль текста, заданный для кнопки.


Название: Re: Custom Widget со стилями
Отправлено: GreatSnake от Март 27, 2012, 17:40
В этом случае потеряется стиль текста, заданный для кнопки.
Какой именно?


Название: Re: Custom Widget со стилями
Отправлено: andrew.k от Март 27, 2012, 19:54
В этом случае потеряется стиль текста, заданный для кнопки.
Какой именно?
Для ToolButton через QSS может быть задан стиль текста.
Как он попадет в TextDocument?


Название: Re: Custom Widget со стилями
Отправлено: QtCoder от Март 29, 2012, 09:36
" Call
 $1.50"
Примеры, советы приветствуются.
All-in!