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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с отрисовкой виджета  (Прочитано 3610 раз)
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« : Июль 26, 2012, 21:47 »

Всем привет.
Пытаюсь отрисовать виджет, унаследованный от QToolButton. Чего хочу добиться: нужно весь виджет закрасить допустим черным цветом, а потом в этом черном цвете прорубить "окно" в виде буквы "А", чтобы фоном для буквы "А" служил первоначальный фон родителя. В принципе всё работает, но появляются странные артефакты (зеленые точки):


Код:
Код:
void ColorPickerButton::paintEvent (QPaintEvent* event) {
QToolButton::paintEvent(event); // даём родителю прорисоваться

QPainter painter;
QSize eventSize = iconSize();
QRect eventRect(QPoint(0, 0), eventSize);

painter.begin(this); // рисуем зеленый фон. Это я добавил для наглядности артефактов
painter.setBrush(QBrush(QColor(0, 255, 0, 255)));
painter.drawRect(eventRect);
painter.end();


// Создаём QImage с черным фоном
QImage backImage(eventSize, QImage::Format_ARGB32_Premultiplied);
QBrush brush;
brush.setStyle(Qt::SolidPattern);
brush.setColor(QColor(0, 0, 0));

painter.begin(&backImage);
painter.setBrush(brush);
painter.drawRect(eventRect);
painter.end();

// Создаём QImage с текстом
QImage textImage(eventSize, QImage::Format_ARGB32_Premultiplied);

painter.begin(&textImage);
QBrush textBrush;
textBrush.setColor(QColor(0, 0, 0, 0)); // рисуем прозрачный фон
painter.setBrush(textBrush);
painter.drawRect(eventRect);

QFont font = painter.font(); // рисуем непрозрачный текст
font.setBold(true);
font.setPointSize(14);
painter.setFont(font);
painter.setPen(QPen(QColor(0, 0, 0, 255)));
painter.drawText (eventRect, Qt::AlignCenter, QString("A"), &eventRect);
painter.end();

// Рисуем QImage с текстом в QImage с черным фоном применяя композит
painter.begin(&backImage);
painter.setCompositionMode(QPainter::CompositionMode_DestinationOut);
painter.drawImage(QPoint(0, 0), textImage);
painter.end();

// Рисуем полученный QImage в виджет
painter.begin(this);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage(QPoint(0, 0), backImage);
painter.end();
}

Кто-нибудь знает, как это исправить?
Записан
ruzik
Гость
« Ответ #1 : Июль 27, 2012, 18:57 »

А ты всегда для отрисовки используешь букву А(как я понимаю там что-то типа инонки)?
Может быть проще использовать QSS и готовую картинку?
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #2 : Июль 28, 2012, 12:54 »

Разобрался сам. Нужно перед заливкой textImage тоже установить композитный режим. Меняем
Код:
painter.begin(&textImage);
QBrush textBrush;
textBrush.setColor(QColor(0, 0, 0, 0)); // рисуем прозрачный фон
painter.setBrush(textBrush);
painter.drawRect(eventRect);
на
Код:
painter.begin(&textImage);
QBrush textBrush;
textBrush.setColor(QColor(0, 0, 0, 0)); // рисуем прозрачный фон
painter.setBrush(textBrush);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.drawRect(eventRect);

ruzik, никогда не работал с QSS, пойду почитаю, с чем его едят.

Edit: еще стиль кисти забыл. Вот правильный код:
Код:
painter.begin(&textImage);
QBrush textBrush;
textBrush.setColor(QColor(0, 0, 0, 0)); // рисуем прозрачный фон
textBrush.setStyle(Qt::SolidPattern);
painter.setBrush(textBrush);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.drawRect(eventRect);
« Последнее редактирование: Июль 28, 2012, 13:03 от Swa » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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