Qt中标绘功能的实现方法对比
使用Qt開發(fā)桌面程序,經常會有標繪的需求,一般有以下幾點:
- 新建:圓、矩形、橢圓、文字標注,插入圖像等;
- 編輯:指對已標繪內容的屬性編輯修改功能;
- 刪除:指對已標繪內容的刪除功能;
- 瀏覽:指提供對已標繪內容的平移、放大縮小等瀏覽操作。
包含標繪功能的最典型的應用是地圖標繪系統(tǒng)。一個簡易的地圖標繪系統(tǒng)demo如下圖所示:
Qt中,標繪功能有不同的實現(xiàn)方式,通常有以下幾種。
基于QPainter的面向過程的實現(xiàn)方式
此種方式下,實現(xiàn)一個標繪系統(tǒng),通常需要創(chuàng)建一個QWidget子類,在子類中實現(xiàn)鼠標、鍵盤等事件響應以及界面刷新顯示。
具體的做法為:
- 新建QWidget子類
- 根據(jù)需求,選擇重載鼠標移動mouseMoveEvent、鼠標點擊mousePressEvent、鼠標釋放mouseReleaseEvent等鼠標事件響應函數(shù),選擇重載按鍵按下keyPressEvent、按鍵釋放keyReleaseEvent等按鍵事件響應函數(shù)。
- 重載paintEvent界面刷新響應函數(shù),根據(jù)輸入實時繪制圖元,刷新界面,響應用戶的操作,實現(xiàn)流暢的交互過程。
此種實現(xiàn)方式最大的優(yōu)點是簡潔,僅僅新建一個類以及重載幾個必要的函數(shù)即可實現(xiàn)簡單的標繪功能。但是它的缺點也是顯而易見的,主要有以下幾點:
- 維護問題。當標繪元素種類增多時,所有的標繪元素的實現(xiàn)代碼都糅合在一個QWidget子類中,這會導致此類逐漸難以維護。如果代碼結構不清晰,容易出現(xiàn)bug。
- 功能問題。一些高級功能特性,例如坐標計算/轉換、仿射變換、層疊特性、裁剪優(yōu)化、圖元命中/索引算法,需要自己來實現(xiàn),實現(xiàn)難度大,工作量也很大。
- 性能問題。如果對性能要求較高,就需要做大量優(yōu)化,自己實現(xiàn)難度大。
所以基于QPainter的面向過程的實現(xiàn)方式比較適用于構建小規(guī)模、功能簡易的標繪系統(tǒng)。
為了克服以上缺點,可以嘗試采用基于QGraphicsView的面向對象的實現(xiàn)方式。
基于QGraphicsView的面向對象的實現(xiàn)方式
基于QGraphicsView的面向對象的實現(xiàn)方式,是指使用Qt庫內置的QGraphicsView模塊構建標繪系統(tǒng)的方法。文章開始部分介紹的地圖標繪系統(tǒng)demo就是基于QGraphicsView實現(xiàn)的。
QGraphicsView庫對標繪業(yè)務進行了建模,抽象出了場景畫布及圖元類,并提供了常用的高級特性。采用面向對象的方式,可以將不同部分的業(yè)務代碼分散到不同的類中,并通過對象間通信完成協(xié)作,從而構建出結構清晰,易于維護的系統(tǒng)。
基于QGraphicsView,使用者可以把更多的精力放在業(yè)務實現(xiàn)上。在構建比較復雜的標繪系統(tǒng)時,使用QGraphicsView是首選方案。
QGraphicsView具體在性能、功能方面的特點,在官方文檔中有詳細描述。除文檔外,官方還提供了“40000 Chips”、“Diagram Scene Example”等完整可用的demo供學習。
QGraphicsView相對于QPainter的區(qū)別在于,它需要一定的學習成本,對面向對象的編碼能力有一定的要求。
結語
通過系統(tǒng)地分析,我們研究了兩種標繪的實現(xiàn)方案。不同實現(xiàn)方案適用于不同的使用場景,實際使用時根據(jù)需求權衡方案即可。
本文原創(chuàng)首發(fā)于微信公眾號“Qt未來工程師”。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的Qt中标绘功能的实现方法对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 耳机用上帝瓦雷调音!华为官方预热Free
- 下一篇: iar stm32_树莓派玩转STM32