Russian Qt Forum
Ноябрь 25, 2024, 03:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Custom Widget со стилями  (Прочитано 3208 раз)
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);
то сложно определить как он отрисует.
Поэтому хотелось бы функцию, которая бы рисовала одну строчку по заданным координатам с текущим стилем.
Т.е. чтобы результат был как у этой строчки.

Примеры, советы приветствуются.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Март 27, 2012, 17:20 »

Сам не пробовал, но может поможет)
Идея задействовать rich-text. Создай QTextDocument и вместо
Код
C++ (Qt)
painter.drawControl(QStyle::CE_ToolButtonLabel,opt);
вызывай
Код
C++ (Qt)
QTextDocument::drawContents( &p, opt.text )
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #2 : Март 27, 2012, 17:37 »

Сам не пробовал, но может поможет)
Идея задействовать rich-text. Создай QTextDocument и вместо
Код
C++ (Qt)
painter.drawControl(QStyle::CE_ToolButtonLabel,opt);
вызывай
Код
C++ (Qt)
QTextDocument::drawContents( &p, opt.text )
В этом случае потеряется стиль текста, заданный для кнопки.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Март 27, 2012, 17:40 »

В этом случае потеряется стиль текста, заданный для кнопки.
Какой именно?
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #4 : Март 27, 2012, 19:54 »

В этом случае потеряется стиль текста, заданный для кнопки.
Какой именно?
Для ToolButton через QSS может быть задан стиль текста.
Как он попадет в TextDocument?
Записан
QtCoder
Гость
« Ответ #5 : Март 29, 2012, 09:36 »

" Call
 $1.50"
Примеры, советы приветствуются.
All-in!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.221 секунд. Запросов: 22.