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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Html text in QButton  (Прочитано 7273 раз)
8: Undefined index: LANG_NAME
Файл: /var/www/html/Sources/geshi/geshi.php
Строка: 4032
fear
Гость
« : Октября 16, 2008, 17:25 »

QButton с текстом html, по аналогии с QLabel, как реализовать или есть готовое решение?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Октября 16, 2008, 18:17 »

ищи по форуму, это уже было
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
fear
Гость
« Ответ #2 : Октября 17, 2008, 16:15 »

ищи по форуму, это уже было
Если речь про эту тему, то полностью вопрос в ней не раскрыли. Метод paintEvent() переопределять таким образом неправильно, потому что приводит к некорректной работе кнопки, не отрисовывается изображение, кнопка неправильно перерисовывается при событиях.

Цитата: pastor
Код:
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? Может кто-нибуть поделится инфой по теме?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Октября 17, 2008, 17:45 »

Переопределение paintEvent вполне корректное решение. Я привел минимальный функционал, далее допиливате уж вы. Копайте класс QStyleOptionButton, устанавливайте иконки и все остальное
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #4 : Октября 17, 2008, 20:17 »

в данном случае переопределение метода QStyle::drawControl() для CE_PushButtonLabel - неправильный путь, т.к. речь идёт о виджете, а не о стиле!
Записан
fear
Гость
« Ответ #5 : Октября 20, 2008, 11:18 »

в данном случае переопределение метода QStyle::drawControl() для CE_PushButtonLabel - неправильный путь, т.к. речь идёт о виджете, а не о стиле!
На чем основано это утверждение? Если посмотреть реализацию QPushButton, то отрисовка контента (текст + иконка) происходит именно в стиле... И в этом есть логика, так как на каждой из платформ кнопка должна отрисовываться по своему, в своем стиле.
Записан
ритт
Гость
« Ответ #6 : Октября 20, 2008, 11:41 »

и?
в каком стиле кнопка QButton отрисовывается с текстом в формате html ? ото ж...

стиль рисует кнопку, мы рисуем на кнопке - все довольны.
если под "стилем" подразумевается такой стиль, который будет устанавливаться непосредственно кнопке, тролли называет такой подход "прокси-стилем" (proxy-style)

в любом случае, пока не появится стандартных кнопок, поддерживающих форматирование хтмл, парсить текст в styleoption'е чтобы потом прогнать через рендерер хтмл и отрисовать на баттоне нелогично. стоит сменить стиль приложения - на кнопке будет хтмльный "мусор"...
Записан