在QWidget中使用其他方式繪圖,比如direct2d,gdi等(我剛學的)
1. 重載paintEvent,裏面加入自己的繪圖代碼。這個大家都想得到
2. 重載QWidget::paintEngine() 返回0
不然畫面會閃爍。可以看文檔,也可以看看這個原始出處(從談話內容看應該是的,之前無法實現的):http://lists.trolltech.com/qt4-preview-feedback/2005-04/thread00609-0.html
windows下Qt提供了QPainter::paintEngine()->getDC(),如果使用這個而不是windows的GetDC()的話可以不重載paintEngine(),因爲QPainter的時自動雙緩衝的。
3. 設置QWidget的屬性 setAttribute(Qt::WA_PaintOnScreen, true)
文檔裏說這個屬性設置後可以用native engine來繪圖。測試了下如果不設這個屬性就會閃爍。(如果你在用gdi繪圖並用上面說的QPainter::paintEngine()->getDC(),那麼就不要設這個屬性)
4. 重載showEvent()。窗口置頂狀態改變之類的要重新進行某些相應的初始化工作。比如gdi繪圖的話要重新用GetDC()獲取device context,direct2d的話要重新創建renderer target,因爲他們是和窗口綁定的,而文檔裏說(windows)置頂狀態改變會重新設定parent什麼的,先hide然後show,正好可以用showEvent()。應該和這個有關,沒調查過代碼。如果不做這步的話窗口置頂後界面就不會更新了,再切換回來也不會。
最後,可以參靠我播放器裏的代碼 vo.h, vo.cpp: https://github.com/wang-bin/QtAV/tree/master/templates 具體例子就不寫了
疑問:
QPainter::beginNativePainting()/endNativePainting() 能用哪些場合?試了下會閃爍
自己實現paintEngine()和QpaintDeveice如何?