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