如果我有一個paprent控件A,那麼我有一個A的子控件B. B嵌入在A.Qt:Paintevent和親子關係?
如果我觸發A的paintEvent,B的paint事件是否會被觸發? 如果我觸發B的paintEvent,A的繪畫事件是否會被觸發?
如果它依賴於其他屬性,那麼屬性是什麼?透明度? 是否有一條通用規則,以便我可以知道哪個Widget的繪畫事件將被觸發?
如果我有一個paprent控件A,那麼我有一個A的子控件B. B嵌入在A.Qt:Paintevent和親子關係?
如果我觸發A的paintEvent,B的paint事件是否會被觸發? 如果我觸發B的paintEvent,A的繪畫事件是否會被觸發?
如果它依賴於其他屬性,那麼屬性是什麼?透明度? 是否有一條通用規則,以便我可以知道哪個Widget的繪畫事件將被觸發?
我認爲最有用的答案是你應該寫你的paintEvent
方法不在乎。因爲實際的答案將取決於您運行的平臺,而且您猜測透明度可能也起着一定的作用,但是小部件是否由本機支持也可能很重要。
Qt5始終對所有窗口小部件使用雙緩衝繪圖,但在實際發生緩衝的粒度(窗口,所有窗口小部件,僅本機支持的窗口小部件)方面沒有指定。如果兩個小部件都是不透明的,我猜測只有你無效的小部件會被重新繪製,因爲另一個將被保存在後臺存儲中。但是,如果使A失效導致重繪B,我也不會感到驚訝。
由於有太多無法控制的東西會導致繪畫事件,所以最簡單的答案就是確保繪畫代碼不關心,並且相信雙緩衝機制只在需要時調用您的代碼太。 (假設你自己不打電話update()
太多)
如果您要取決於paintEvent
可以在什麼情況下被調用,那麼您做錯了。 A paintEvent
必須是總是如果小部件可見,則可調用。無論系統的其他部分發生了什麼,您都必須在任何時候調用它,以便必須。
理想情況下,您的paintEvent
的實現不應該修改對象的狀態。我發現它有助於落實轉發到const
幫手,使之明顯:
class MyWidget : public QWidget {
void paintEvent(QPaintEvent * event) Q_DECL_OVERRIDE {
QPainter painter(this);
paintEventImpl(event, painter);
}
void paintEventImpl(QPaintEvent *, QPainter &) const;
...
};
我的paintEvent總是調用,問題是,這是一個有點貴(吸引了許多圖像)。所以我想減少它被調用的次數。 – Nyaruko
@Nyaruko圖像繪製不應該很昂貴,如果你的圖像沒有縮放,它是一個條紋內存副本。如果您縮放圖像,它將有助於緩存它們。它應該非常快,如果不是,你的'paintEvent'不知何故被破壞。你的問題是經典的X-Y。你擔心什麼時候調用paintEvent,但是你應該問如何讓它更快! –