Всем привет.
Пытаюсь отрисовать виджет, унаследованный от 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();
}
Кто-нибудь знает, как это исправить?