2015-04-28 85 views
1

我有一個QWidget,它有一個非常強大的CPU事件處理程序。但它幾乎不需要更新,雖然它在屏幕上移動。我知道如何實現雙緩衝油漆機制,但因爲所有QWidgets已經擁有了雙緩衝系統,我很好奇,想看看是不是可以使用它的目的,這樣的事情:如何使用qwidget雙緩衝區

void ParametersWidget::paintEvent(QPaintEvent *) 
{ 
    if(isnt_changed) { 
     bypassUpdate(); 
    } 
    else { 
    drawStuff(); 
    } 
} 

任何幫助將不勝感激。

回答

1

您不能忽略繪畫事件,因爲您的小部件可能已被其他窗口覆蓋,並且當移動此窗口時,您的小部件需要重新繪製。一種可能的優化是隻繪製髒區域。它可以通過撥打QPaintEventregion()獲得。沒有理由重新繪製整個小部件,如果只有一部分需要重新繪製。

不知道你的小部件包含了什麼,它很難給出任何更具體的優化提示。如果小部件的內容需要昂貴的數據庫查詢或大量計算,那麼當然應該確保僅在需要時執行這些操作,保存結果並在重新繪製期間使用結果。

+0

以及這與我的問題有何關係,關於雙緩衝? –

+1

你提到你有一個非常CPU的油漆處理程序,我想你想嘗試提高性能。當我讀到你的問題時,我的印象是你認爲雙緩衝可以幫助你達到目的,但雙緩衝與性能無關(只有閃爍)。如果您對如何提高性能不感興趣,請忽略我的答案。對於雙緩衝,你不需要做任何事情。 Qt自Qt 4.0以後自動爲你做。 –

+0

看,讓我解釋一下。正如你所說的那樣,Qt會自動進行雙緩衝。這意味着它將我的小部件的快照作爲像素圖存儲在RAM中,並且在決定時渲染它而不是調用我的小部件的繪圖函數。現在考慮它已經收到一個更新信號並且調用了paint函數,但是我的小部件知道它不需要更新。顯然,我可以保留最後一個paint的pixmap並重新渲染它,但是我想看看是否有方法使用內置的緩衝pixmap,而不是手動將其保存在額外的緩衝區中。 –