2016-04-26 22 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派生類上繪製矩形,該派生類是在第三方庫中實現的,而在這個庫中,我受到了有限的控制。

回答

3

我發現三個問題的代碼:

  1. 第一繪製矩形 alpha混合(來源轉移模式),因爲你是第一個繪製調用後設置的組成模式。第二種是使用源模式(即按原樣複製源像素,不執行alpha混合)。
  2. 事實上,Source不會執行您似乎想要的alpha混合。所以不要使用它!默認的合成模式做你想要的。
  3. 繪製兩個不同的形狀將執行它們之間的組合。這顯然是預期的,因爲你在做兩個繪製調用;第二輪平局將會發現第一輪已經改變的目的地。如果你不想這樣做,你必須找到一種方法來繪製兩個形狀一個繪製調用(例如:將它們兩個添加到一個QPainterPath,然後在一個繪製調用中繪製路徑),或者在後期階段(例如:將它們繪製到不透明的QImage上,然後在一次繪製調用中將圖像混合到目標上)。
+0

您的第三條評論有效。不過,我需要繪製很多(細)矩形,在這種情況下painterpath方法非常慢。 QImage方法適用於大矩形,但如果尺寸較小(小於1像素),則無法使用。有關此用例的更多提示? – Frank

+0

你是什麼意思?你不能只畫出同一幅圖像上的所有矩形(與目的地一樣大),然後將整個圖像畫出來? – peppe

相關問題