開始
使用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是推薦使用的。