Композиция QPainter не работает должным образом с фоном

Я пытаюсь нарисовать два прямоугольника с одинаковым цветом и прозрачностью на QFrame с белым фоном. Эти прямоугольники должны перекрываться, и их прозрачность не должна изменяться (также в перекрывающейся области). Ну вот так:

введите описание изображения здесь

Вот код, который у меня есть:

class Canvas : public QFrame
{
public:
void paintEvent(QPaintEvent * event) override;
};

void Canvas::paintEvent(QPaintEvent *event)
{
QPainter painter( this );

painter.setPen(QPen(Qt::NoPen));
painter.setBrush(QBrush(QColor(0,0,255,125)));

painter.drawRect(QRect(10,10,100,100));
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.setBrush(QBrush(QColor(0, 0, 255, 125)));
painter.drawRect(QRect(80, 80, 100, 100));
}

int main( int argc, char **argv )
{
QApplication a( argc, argv );

Canvas canvas;
canvas.setAutoFillBackground(true);
QPalette pal;
pal.setColor(QPalette::Window, QColor(Qt::red));
canvas.setBackgroundRole(QPalette::Window);
canvas.setPalette(pal);
canvas.show();

return a.exec();
}

Однако это дает следующее изображение:

введите описание изображения здесь

Я испробовал все возможные режимы композиции для художника, но, похоже, ни один из них не дал мне желаемого эффекта. Я думаю, CompositionMode_Source является правильным, поскольку, если я использую следующий код:

QPixmap pixmap(200, 200);
pixmap.fill(Qt::transparent);

QPainter painter(&pixmap);
painter.setPen(QPen(Qt::NoPen));
painter.setBrush(QBrush(QColor(0, 0, 255, 125)));

painter.drawRect(QRect(10, 10, 100, 100));
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.setBrush(QBrush(QColor(0, 0, 255, 125)));
painter.drawRect(QRect(80, 80, 100, 100));

QLabel label;
label.setPixmap(pixmap);
label.show();

Я получаю желаемый эффект (но без красного фона):

введите описание изображения здесь

Однако, если я изменю заливку на Qt :: red, я получу снова:

введите описание изображения здесь

Что мне здесь не хватает? Как я могу получить желаемый эффект? Фактическое применение для этого заключается в том, что я хочу рисовать прямоугольники в производном классе QFrame, который реализован в сторонней библиотеке, над которой у меня ограниченный контроль.

0

Решение

Я обнаружил три проблемы с кодом:

  1. первый прямоугольник нарисован с альфа-смешивание (режим Source Over), потому что вы устанавливаете режим композиции после первого вызова отрисовки. Второй вместо этого использует режим Source (то есть копирует исходные пиксели как есть, не выполняет альфа-смешивание).
  2. В самом деле, Source не выполняет альфа-смешивание, как вам кажется. Так что не используйте это! Режим композиции по умолчанию делает то, что вы хотите.
  3. Рисование двух разных фигур будет выполнять композицию между ними. Это, очевидно, ожидается, так как вы делаете два рисовать звонки; второй вызов отрисовки найдет пункт назначения, уже измененный первым. Если вы не хотите этого, вы должны найти способ нарисовать обе фигуры в один вызов draw (например, добавьте их обоих в один QPainterPath, затем нарисуйте путь в одном вызове draw) или выполните композицию на более позднем этапе (например: нарисуйте их в непрозрачном QImage, затем смешайте изображение с местом назначения в один розыгрыш).
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector