在Qt Widget中使用QPainter之外的引擎進行繪圖

    最近在給自己的播放器(https://github.com/wang-bin/QtAV)加寫非QPainter的渲染方式,解決了一些以前沒碰到過的問題。
    在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如何?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章