2016-04-26 1 views
0

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

enter image description here

Вот код, который я до сих пор:

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(); 
} 

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

enter image description here

Я пробовал все возможные режим композиции для художника, но никто, кажется, не дает мне желаемого эффекта. Я предполагаю, что 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(); 

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

enter image description here

Однако если изменить заливку Qt :: красный я снова:

enter image description here

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

ответ

3

я пятно три проблемы с кодом:

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

Ваше третье замечание работает. Однако мне нужно нарисовать много (тонких) прямоугольников, и в этом случае метод painterpath довольно медленный. Метод QImage хорошо работает для больших прямоугольников, но если размер небольшой (меньше 1 пикселя), он не может быть использован. Дополнительные советы для этого случая использования? – Frank

+0

Что значит? Не можете ли вы просто нарисовать все прямоугольники на одном и том же изображении (размером с место назначения), а затем разбить все изображение? – peppe

 Смежные вопросы

  • Нет связанных вопросов^_^