Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Swa от Июль 26, 2012, 21:47



Название: Проблема с отрисовкой виджета
Отправлено: Swa от Июль 26, 2012, 21:47
Всем привет.
Пытаюсь отрисовать виджет, унаследованный от QToolButton. Чего хочу добиться: нужно весь виджет закрасить допустим черным цветом, а потом в этом черном цвете прорубить "окно" в виде буквы "А", чтобы фоном для буквы "А" служил первоначальный фон родителя. В принципе всё работает, но появляются странные артефакты (зеленые точки):
(https://lh3.googleusercontent.com/-596C9CcDN8k/UBGN0IpifzI/AAAAAAAAAPs/zf2K7wUl3SY/s83/im.png)

Код:
Код:
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();
}

Кто-нибудь знает, как это исправить?


Название: Re: Проблема с отрисовкой виджета
Отправлено: ruzik от Июль 27, 2012, 18:57
А ты всегда для отрисовки используешь букву А(как я понимаю там что-то типа инонки)?
Может быть проще использовать QSS и готовую картинку?


Название: Re: Проблема с отрисовкой виджета
Отправлено: Swa от Июль 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);