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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [Решено] QToolButton и иконки  (Прочитано 18555 раз)
QtCoder
Гость
« Ответ #15 : Август 22, 2012, 07:58 »

Идеологически верный вариант
Код
C++ (Qt)
void ToolButton::paintEvent(QPaintEvent * event)
{
  QToolButton::paintEvent(event);
  QPainter painter(this);
 
  QRect rect = event->rect();
  QTextOption opt;
  opt.setAlignment(Qt::AlignCenter);
  painter.drawText(rect, text_, opt);
 
  int y = qAbs(rect.height() - pixmap_.height()) / 2;
  const int x = 6;
  painter.drawPixmap(x, y, pixmap_);
}

Вверху ToolButton, снизу QToolButton
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #16 : Август 22, 2012, 08:29 »

Идеологически верный вариант
Код
C++ (Qt)
void ToolButton::paintEvent(QPaintEvent * event)
{
  QToolButton::paintEvent(event);
  QPainter painter(this);
 
  QRect rect = event->rect();
  QTextOption opt;
  opt.setAlignment(Qt::AlignCenter);
  painter.drawText(rect, text_, opt);
 
  int y = qAbs(rect.height() - pixmap_.height()) / 2;
  const int x = 6;
  painter.drawPixmap(x, y, pixmap_);
}

Вверху ToolButton, снизу QToolButton

м-да, а столько времени на разговоры было потрачено )))
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Serr500
Гость
« Ответ #17 : Август 22, 2012, 10:18 »

Идеологически верный вариант у меня почему-то не работает.

Верхняя картинка - с QPushButton::paintEvent, нижняя - без.
Записан
QtCoder
Гость
« Ответ #18 : Август 22, 2012, 10:26 »

Идеологически верный вариант у меня почему-то не работает.

Верхняя картинка - с QPushButton::paintEvent, нижняя - без.

Картинки и текст надо передавать своими функциями. Не использовать setText и setIcon.
Вызов родительского paintEvent отрисует кнопку без иконки и тектса, а затем уже по ней рисуем нашу картинку и текст. Очевидно, же.
Код
C++ (Qt)
  ToolButton * tb = new ToolButton(this);
  tb->setDrawPixmap(QPixmap(":/images/new.png"));
  tb->setDrawText("Test");
 
Записан
Serr500
Гость
« Ответ #19 : Август 22, 2012, 10:34 »

Тьфу, блин!  Злой Действительно.  Грустный Извиняюсь за тупость.   В замешательстве
Записан
Serr500
Гость
« Ответ #20 : Август 22, 2012, 11:06 »

Небольшое изучение исходников Qt и нежелание создавать отдельные поля и методы нового объекта привели к созданию следующего кода:

Код:
void QPushButtonPlus::paintEvent(QPaintEvent *event)
{
    QStylePainter StylePainter(this);
    QStyleOptionButton StyleOption;
    initStyleOption(&StyleOption);
    StyleOption.text.clear();
    StyleOption.icon = QIcon();

    StylePainter.drawControl(QStyle::CE_PushButton, StyleOption);

    QRect Rect = event->rect();
    QTextOption TextOption;
    TextOption.setAlignment(Qt::AlignCenter);
    StylePainter.drawText(Rect, text(), TextOption);

    QPixmap Pixmap = icon().pixmap(iconSize());
    int y = qAbs(Rect.height() - Pixmap.height()) / 2;
    const int x = 6;
    StylePainter.drawPixmap(x, y, Pixmap);
}
Огромное спасибо QtCoder за помощь.
Записан
QtCoder
Гость
« Ответ #21 : Август 22, 2012, 12:18 »

Небольшое изучение исходников Qt и нежелание создавать отдельные поля и методы нового объекта привели к созданию следующего кода:

Код:
void QPushButtonPlus::paintEvent(QPaintEvent *event)
{
    QStylePainter StylePainter(this);
    QStyleOptionButton StyleOption;
    initStyleOption(&StyleOption);
    StyleOption.text.clear();
    StyleOption.icon = QIcon();

    StylePainter.drawControl(QStyle::CE_PushButton, StyleOption);

    QRect Rect = event->rect();
    QTextOption TextOption;
    TextOption.setAlignment(Qt::AlignCenter);
    StylePainter.drawText(Rect, text(), TextOption);

    QPixmap Pixmap = icon().pixmap(iconSize());
    int y = qAbs(Rect.height() - Pixmap.height()) / 2;
    const int x = 6;
    StylePainter.drawPixmap(x, y, Pixmap);
}
Огромное спасибо QtCoder за помощь.

Всё хорошо, теперь подумай, что произойдет если размер иконки будет больше размера кнопки.
Записан
Serr500
Гость
« Ответ #22 : Август 22, 2012, 13:28 »

Всё нормально будет. Сейчас проверил. Кнопка увеличивается в размерах чтобы вместить иконку.
Записан
QtCoder
Гость
« Ответ #23 : Август 22, 2012, 13:31 »

Всё нормально будет. Сейчас проверил. Кнопка увеличивается в размерах чтобы вместить иконку.

А ну понятно, ты же ставишь setIcon вот оно и увеличивает. В моем примере бы обрезалось.
Записан
Serr500
Гость
« Ответ #24 : Август 22, 2012, 15:34 »

Допилил обработчик. Убрал "магическое число" 6, заставив вытаскивать маргины из стиля. И сделал выравнивание текста не по центру кнопки, а по центру свободного от иконки пространства. Вот что получилось:
Код:
void QPushButtonPlus::paintEvent(QPaintEvent *)
{
    // Основа кнопки.
    QStylePainter StylePainter(this);
    QStyleOptionButton StyleOption;
    initStyleOption(&StyleOption);
    StyleOption.text.clear();
    StyleOption.icon = QIcon();
    StylePainter.drawControl(QStyle::CE_PushButton, StyleOption);

    // Прямоугольник для рисования содержимого.
    QRect SubRect = style()->subElementRect(QStyle::SE_PushButtonContents, &StyleOption, this);

    // Иконка.
    if (!icon().isNull()) {
        QPixmap Pixmap = icon().pixmap(iconSize());
        int y = (SubRect.height() - Pixmap.height()) / 2;
        StylePainter.drawPixmap(SubRect.x(), SubRect.y() + y, Pixmap);
        SubRect.setX(Pixmap.width() + 2* SubRect.x());
    }

    // Текст.
    if (!text().isEmpty()) {
        QTextOption TextOption;
        TextOption.setAlignment(Qt::AlignCenter);
        StylePainter.drawText(SubRect, text(), TextOption);
    }
}
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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