QPainter::begin: Paint device returned engine == 0, type: 1


開始

使用QPainter畫圖,需要繼承QWidget,重寫paintEvent()虛函數,在里面進行繪圖。

或者可以考慮繪制到QImage或者QPixmap上面,然后在paintEvent()里面調用QPainter的繪制圖像的函數。

 

場景

//安裝事件過濾器
ui->view->installEventFilter(this);

  

//過濾
bool SemiA9120::eventFilter(QObject *watched, QEvent *event)
{
	if(watched == ui->view && event->type() == QEvent::Paint)
     {
         paintonPolarPlot();
     }

	return true;/*返回 true:告訴Qt已經處理的這個事件*/
}

 

--------------------------------線程中---------------------------

	g_testMutex.unlock();
//觸發信號
	ptr->sign_redrawPolar();

  

//信號-槽函數連接
QObject::connect(this,SIGNAL(sign_redrawRect()),this,SLOT(paintonPolarPlot()));

 后來用了update()觸發重繪事件

后記

update()允許Qt來優化速度並且防止閃爍。

repaint()是立即調用paintEvent(),而update()是幾次執行才調用一次paintEvent()。

 

paintEvent()

paintEvent()是一個虛函數槽(slot),子類可以對父類的paintEvent進行重寫。

當調用update(),repaint()的時候,paintEvent()會被調用,另外,當界面有任何改變的時候,paintEvent()也會被調用,這種界面的改變包括界面從隱藏到顯示,界面尺寸改變,當然還包括界面內容改變的時候會被調用。

paintEvent()是已經被高度優化過的函數,它本身已經自動開啟並實現了雙緩沖(X11系統需要手動去開啟雙緩沖),因此Qt中重繪不會引起任何閃爍。

update()和repaint()

update和repaint是一類的,需要重繪的對象主動去調用,然后重繪。update和repaint調用之后,都會去調用paintEvent()

update()跟repaint()比較,update則更加有優越性。update()調用之后並不是立即重繪,而是將重繪事件放入主消息循環中,由main的event loop來統一調度的(其實也是比較快的)。update在調用paintEvent之前,還做了很多優化,如果update被調用了很多次,最后這些update會合並到一個大的重繪事件加入到消息隊列,最后只有這個大的update被執行一次。同時也避免了repaint()中所提到的死循環。因此,一般情況下,我們調用update就夠了,跟repaint()比起來,update是推薦使用的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM