ищи по форуму, это уже было
Если речь про эту
тему, то полностью вопрос в ней не раскрыли. Метод paintEvent() переопределять таким образом неправильно, потому что приводит к некорректной работе кнопки, не отрисовывается изображение, кнопка неправильно перерисовывается при событиях.
class HTMLButton: public QPushButton {
Q_OBJECT
public:
HTMLButton(QWidget *parent = 0) : QPushButton(parent) {
init();
}
HTMLButton(const QString &text, QWidget *parent = 0) : QPushButton(text, parent) {
init();
}
protected:
virtual void paintEvent ( QPaintEvent *event ) {
QPainter painter(this);
QStyleOptionButton styleOps;
styleOps.initFrom(this);
styleOps.state = isDown() ? QStyle::State_Sunken : QStyle::State_Raised;
if (isDefault())
styleOps.features |= QStyleOptionButton::DefaultButton;
style()->drawControl(QStyle::CE_PushButton, &styleOps, &painter, this);
QAbstractTextDocumentLayout::PaintContext ctx;
ctx.palette = palette();
doc->setHtml(text());
doc->documentLayout()->draw(&painter, ctx);
}
private:
void init() {
doc = new QTextDocument(this);
}
private:
QTextDocument *doc;
};
Правильный путь - переопределение метода QStyle::drawControl() для CE_PushButtonLabel. Но как определить размер области необходимой для отрисовки html-текста? QTextDocument::pageSize()? Почему этот метод возвращает QSizeF, а не QSize? Может кто-нибуть поделится инфой по теме?