2010-09-11 28 views
1

我的主要窗口有以下抽獎功能:文物到一個QWidget

void MainWindow::paintEvent(QPaintEvent*) 
{ 
    QImage sign(50, 50, QImage::Format_ARGB32_Premultiplied); 
    QPainter p(&sign); 
    p.setRenderHint(QPainter::Antialiasing, true); 
    p.fillRect(sign.rect(), QColor(255, 255, 255, 0)); 
    p.setBrush(Qt::blue); 
    p.setPen(Qt::NoPen); 
    p.drawEllipse(0, 0, sign.width(), sign.height()); 
    p.end(); 

    QPainter painter(this); 
    painter.drawImage(rect(), sign, sign.rect()); 
} 

因此,基本上,它繪製一個藍色的實心圓到QImage的,比繪製一條QImage的到小部件。但是,當我調整窗口的大小時,會出現奇怪的人爲現象(位於左上角)。這是什麼樣子:

原: alt text

有沒有人有一個想法,爲什麼是這樣的: alt text

改變窗口大小後?

(我的Ubuntu 10.04下工作,如果是的利息)

回答

3

我覺得你QImage與垃圾初始化。在構建它之後,請致電sign.fill()。我試過你的代碼,甚至在我的機器上調整大小之前,這些工件都存在。

從Qt的文檔:

QImage的:: QImage的(INT寬度,整數 高度,格式格式)

構造具有給定寬度,高度和 格式的 圖像。

警告:這將創建一個包含未初始化數據的QImage 。在調用填充() 以用適當的 像素值填充圖像,然後使用QPainter將其映射到 之前。

+0

非常感謝你,是沒有的伎倆! :)我假設「p.fillRect(sign.rect(),QColor(255,255,255,0));」會做「初始化」,因爲它會用一種顏色填充完整的QImage。然而,一旦我插入「fill()」調用,工件就會消失。不過,我不確定我是否理解了爲什麼。不過,非常感謝您的回答! :) – Tom 2010-09-12 06:23:40

+0

我相信問題是,具有指定顏色和透明度的p.fillRect()正在用指定的透明度值調整的顏色填充矩形。它實際上並不改變保留其隨機未初始化值的圖像的alpha通道。這只是一個猜測。 – 2010-09-12 16:59:25

1

您的圖像是透明的(圓圈除外),並且在繪製(調整大小)圖像之前,您從不清除窗口,因此可能會遺留上一個圓圈/窗口大小的工件。

之前繪製的圖像到窗口,添加這些行:

QPalette palette = QApplication::palette(); 
painter.fillRect(event->rect(), palette.color(QPalette::Window)); 
+0

感謝您的提示。 :)我嘗試過,但實際上並沒有解決問題。但是,你仍然認爲這個小部件需要被清除:) – Tom 2010-09-12 06:22:56