2016-03-08 33 views
0

我試圖讓我的部件畫一個矩形,它接收到的每個paintEvent。矩形應該一次增加1px,填滿一個正方形。然而,我得到的只是最新的(也是最大的)矩形。Qt:爲什麼我的paintEvent()在執行任務前抹去所有東西?

void TestClass::paintEvent(QPaintEvent* e){ 
    static int size = 1; 
    QStylePainter painter(this); 
    painter.setPen(Qt::blue); 
    painter.drawRect(QRect(50, 50, size, size)); 
    size++; 
} 

我不明白爲什麼會這樣。我希望畫家能夠在已經存在的東西上畫畫。相反,它似乎刪除以前繪製的矩形,隨時留下一個矩形。有任何想法嗎?

setAutoFillBackground(true/false)不會改變背景的顏色。

mousePressEvent()內部引發paintEvent I update()。所以我的矩形隨着每次點擊而增長。

非常感謝。

+0

您只能看到最大的正方形,因爲它完全覆蓋了之前繪製的所有較小的正方形。你期望看到什麼? – Flopp

+0

@Flopp這很有趣,謝謝。矩形沒有填充,所以我沒有想到他們能夠覆蓋任何東西。我會看看我能否證實這一點。 – Jersey

+0

恩,你說得對;你的代碼應該繪製一個未填充的矩形。 – Flopp

回答

1

因此,要回答我的問題,我發現:

(1)update(QRect area)擦除做任何事情之前它的參數所指定的區域。不帶參數地調用更新會擦除整個小部件區域。 (2)已經清除的區域是任何繪畫完成的唯一區域,即使您的paintEvent()看起來要在其他地方繪畫也不例外。小部件的未觸及部分不受影響。

例如,考慮這個paintEvent()

void myWidget::paintEvent(QPaintEvent* e){ 
    QPainter painter(this); 
    static int counter = 1; 

    if (counter % 2){ 
     painter.fillRect(0, 0, 199, 199, Qt::blue); //Fill with blue color 
    } else { 
     painter.fillRect(0, 0, 199, 199, Qt::green); //Fill with green color 
    } 
    counter++; 
} 

重複調用update()將針對每個像素在綠色和藍色之間切換。但是,在調用update(QRect(0, 0, 50, 50))時,只有小部件區域的左上四分之一區域會改變其顏色,其他像素將保持不變,即使paintEvent(..)包含指示始終繪製整個小部件的區域。

我不知道我的答案在任何情況下是否完全正確,但我希望更多的小白鼠對update()paintEvent()之間的關係感到困惑,所以我會提供這個作爲急救。

迎接。

0

QWidget::paintEvent docs狀態

當油漆事件發生時,更新區域已正常 刪除,因此,您所畫小部件的背景。

所以,在你的例子中可能就是這種情況。

+0

那麼,「通常」是指良好的編程標準還是存在工作中的Qt機制?我想我誤解了qt是如何完成繪畫的。我認爲任何與paintEvent()內部繪製小部件有關的東西都會發生。 – Jersey

0

您無法保證調用paintEvent之間的任何狀態保存。這是漫長而短暫的。您實施paintEvent的唯一正確語義是:繪製(至少)傳遞給您的整個區域,如:觸摸每個像素,除非您的小部件在繪畫之前被預先清除。

相關問題