Я пытаюсь нарисовать два прямоугольника с одинаковым цветом и прозрачностью на 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, который реализован в сторонней библиотеке, над которой у меня ограниченный контроль.
Я обнаружил три проблемы с кодом:
Других решений пока нет …