и?
в каком стиле кнопка QButton отрисовывается с текстом в формате html ? ото ж...
Если бы кнопка отрисовывалась с текстом в формате html, не было бы этой темы
стиль рисует кнопку, мы рисуем на кнопке - все довольны.
Не понял смысловой нагрузки этого предложения, если фразой 'мы рисуем на кнопке' вы хотели сказать что контент кнопки QPushButton рисуется в методе paintEvent(), то это не правда, если посмотреть исходный код библиотеки, видно что кнопка рисуется от начала до конца в стиле
void QPushButton::paintEvent(QPaintEvent *)
{
QStylePainter p(this);
QStyleOptionButton option;
initStyleOption(&option);
p.drawControl(QStyle::CE_PushButton, option);
}
case CE_PushButtonLabel:
if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
QRect textRect = button->rect;
uint tf = Qt::AlignVCenter | Qt::TextShowMnemonic;
if (!styleHint(SH_UnderlineShortcut, button, widget))
tf |= Qt::TextHideMnemonic;
if (!button->icon.isNull()) {
//Center both icon and text
QRect iconRect;
QIcon::Mode mode = button->state & State_Enabled ? QIcon::Normal : QIcon::Disabled;
if (mode == QIcon::Normal && button->state & State_HasFocus)
mode = QIcon::Active;
QIcon::State state = QIcon::Off;
if (button->state & State_On)
state = QIcon::On;
QPixmap pixmap = button->icon.pixmap(button->iconSize, mode, state);
int labelWidth = pixmap.width();
int labelHeight = pixmap.height();
int iconSpacing = 4;//### 4 is currently hardcoded in QPushButton::sizeHint()
int textWidth = button->fontMetrics.boundingRect(opt->rect, tf, button->text).width();
if (!button->text.isEmpty())
labelWidth += (textWidth + iconSpacing);
iconRect = QRect(textRect.x() + (textRect.width() - labelWidth) / 2,
textRect.y() + (textRect.height() - labelHeight) / 2,
pixmap.width(), pixmap.height());
iconRect = visualRect(button->direction, textRect, iconRect);
tf |= Qt::AlignLeft; //left align, we adjust the text-rect instead
if (button->direction == Qt::RightToLeft)
textRect.setRight(iconRect.left() - iconSpacing);
else
textRect.setLeft(iconRect.left() + iconRect.width() + iconSpacing);
if (button->state & (State_On | State_Sunken))
iconRect.translate(pixelMetric(PM_ButtonShiftHorizontal, opt, widget),
pixelMetric(PM_ButtonShiftVertical, opt, widget));
p->drawPixmap(iconRect, pixmap);
} else {
tf |= Qt::AlignHCenter;
}
if (button->state & (State_On | State_Sunken))
textRect.translate(pixelMetric(PM_ButtonShiftHorizontal, opt, widget),
pixelMetric(PM_ButtonShiftVertical, opt, widget));
if (button->features & QStyleOptionButton::HasMenu) {
int indicatorSize = pixelMetric(PM_MenuButtonIndicator, button, widget);
if (button->direction == Qt::LeftToRight)
textRect = textRect.adjusted(0, 0, -indicatorSize, 0);
else
textRect = textRect.adjusted(indicatorSize, 0, 0, 0);
}
drawItemText(p, textRect, tf, button->palette, (button->state & State_Enabled),
button->text, QPalette::ButtonText);
}
break;
если под "стилем" подразумевается такой стиль, который будет устанавливаться непосредственно кнопке, тролли называет такой подход "прокси-стилем" (proxy-style)
Вы что-то путаете, концепция прокси-стиля позволяет определить единый стиль для всех платформ. Стиль может быть установлен как определенному виджету, так и приложению в целом. Говоря о стиле я имею в виду класс QStyle.
в любом случае, пока не появится стандартных кнопок, поддерживающих форматирование хтмл, парсить текст в styleoption'е чтобы потом прогнать через рендерер хтмл и отрисовать на баттоне нелогично. стоит сменить стиль приложения - на кнопке будет хтмльный "мусор"...
Что мешает сделать 'стандартную' кнопку самостоятельно? Для начала мне кажется стоит рассмотреть ситуацию с одним стилем, не забегая далеко вперед, изменение стиля требуется далеко не каждому приложению.