Я пытаюсь нарисовать два прямоугольника с таким же цветом и прозрачностью на QFrame с белым фоном. Эти прямоугольники должны перекрываться, и их прозрачность не должна изменяться (также в области перекрытия). Так как это:Состав QPainter работает не так, как ожидалось, с фоном
Вот код, который я до сих пор:
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 :: красный я снова:
Что я здесь отсутствует? Как я могу получить желаемый эффект? Фактическое приложение для этого - это то, что я хочу рисовать прямоугольники на производном классе QFrame, который реализован в стороннем lib, над которым я ограниченным контролем.
Ваше третье замечание работает. Однако мне нужно нарисовать много (тонких) прямоугольников, и в этом случае метод painterpath довольно медленный. Метод QImage хорошо работает для больших прямоугольников, но если размер небольшой (меньше 1 пикселя), он не может быть использован. Дополнительные советы для этого случая использования? – Frank
Что значит? Не можете ли вы просто нарисовать все прямоугольники на одном и том же изображении (размером с место назначения), а затем разбить все изображение? – peppe