2010-01-20 74 views
0

我想在QsplashScreen上繪製一個PNG文件。我試圖通過QPainter來做到這一點。我想通過QPainter這樣做的原因是因爲我希望它能夠平滑地最小化(直到它消失),當我剛剛修理它時,它看起來並不平坦。調用開始時QPainter失敗

我將QSplashScreen傳遞給QPainter構造函數。當我調用QPainter中的begin(),並以QSplashScreen作爲參數時,它在斷言d->active上失敗。當我提供Qpixmap時,它會以同樣的方式發生。

我在做什麼錯?我應該如何啓動QPainter的begin()?

回答

5

您想要創建QSplashScreen的子類並重新實現drawContents。請參閱docs

使用他們給你的畫家,你應該沒問題。

+0

謝謝,它的確幫助我和我我的平穩過渡。 我還有一個問題。由於某種原因,原始圖片仍然存在。會發生什麼情況是我首先顯示全尺寸圖片,然後平滑地將其最小化。問題是,當照片被最小化時,原始的全尺寸照片仍然保留在背景中。 我試圖setVisible(false)的第一幅畫,它並沒有幫助... 任何想法? 非常感謝。 – user254974 2010-01-24 09:37:00

+0

如果沒有真正看到它,請嘗試使用backgroundMode(http://doc.trolltech.com/4.6/qpainter.html#backgroundMode)和eraseRect(http://doc.trolltech.com/4.6/qpainter.html#eraseRect) – 2010-01-24 13:58:22

0

具體地說關於使用QPainter,對於begin方法的文檔清楚說明只有一個畫家可以在同一時間是活動的一個給定的塗料設備上,並且還,使用的QPainter構造版本自動調用開始爲值你傳入所以,如果你正在做它作爲你的問題描述,就像這樣:

QWidget *widget(...); 

QPainter painter(widget); 
painter.begin(widget); // <-- error, we already have a painter active on that paint device (our own). 
// Do stuff... 
painter.end(); 

這可能是因爲Qt的應先關閉裝置,然後打開新的,但像上面這樣的代碼意味着你不完全不瞭解QPainter的工作原理。您應該幾乎總是使用將設備傳遞給構造函數的版本,並且永遠不需要致電beginend。 (有時候,你可能會保持畫家很長一段時間,特別是使用beginend就可以了 - 在這種情況下,你不應該初始化它到設備上。)

+0

我不同意最後一部分。如果你剛剛開始,你應該總是使用提供給你的QPainter重寫繪畫或繪製事件。但無論如何,你應該閱讀你使用的函數的文檔。 – 2010-01-20 20:08:08