




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Qt實現實時鼠標繪制圖形目錄功能實現1:記錄圖形第一個繪制點2:實時獲取鼠標最新位置并繪圖3:釋放繪制點,繪制最終圖形總結上一章節介紹了關于QGraphicsView的基礎講解,以及簡單的類圖創建,由上一章節中最后展示的動畫效果來看,今年主要講述如何在QGraphicsView架構下,實時拖動鼠標繪制圖形!
今天主要以矩形為例,再來看一下展示效果吧!
功能實現
想要實現鼠標拖拽繪圖的效果,離不開鼠標的三大事件:按下、移動、釋放
那么具體實現實時繪制矩形框的核心流程是什么呢?
第一步:鼠標左鍵點擊,記錄初始點擊位置
第二步:在窗口中移動鼠標,實時獲取鼠標拖動點,根據拖動點繪制指定形狀
第三步:鼠標點擊右鍵釋放鼠標,繪制最終圖形
描述的實現流程很簡單,那么,接下來就實際操作吧!
在進行鼠標點擊繪制的時候,為了兼容多個圖形的實時繪制,這里,不只是用兩個QPoint成員變量記錄鼠標點,而是采取了vectorQPontF容器存儲的方式。
例如:三角形圖形,需要三個點才能確定圖形;曲線圖形,是由N多個點才能確定圖形;等等。。。
所以說,這里采用了vector容器進行數據存儲,任何圖形的點都可以進行存儲。
所有的圖形枚舉類型,如下表格:
枚舉類型形狀Drawing_Normal無圖形繪制Drawing_Circular圓形Drawing_StraightLine直線Drawing_Rectangular矩形Drawing_Triangle三角形Drawing_ManyLineSegements多線段Drawing_Curve曲線
今天只講述矩形:Drawing_Rectangular
1:記錄圖形第一個繪制點
只有鼠標點擊后才能獲取當前點擊點的位置,所以,記錄按下點操作應該是在鼠標的mousePressEvent中實現的。
voidQCustomQGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent*e)
//TODO:鼠標左鍵,點擊繪制圖形;鼠標右鍵,點擊拖動圖形
QGraphicsScene::mousePressEvent(e);
if(e-button()Qt::LeftButton)
//當圖形處于繪制狀態時
if(m_enumShape!=Drawing_Normal)
//記錄鼠標按下的點
m_vetPoints.push_back(e-scenePos());
}
代碼解析:當進入到鼠標按下消息后,只有在左鍵按下狀態時,才做繪圖操作,并且當前形狀枚舉類型有效。
2:實時獲取鼠標最新位置并繪圖
鼠標想要實時繪制,那一定是在鼠標的mouseMoveEvent事件中操作的。
voidQCustomQGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent*e)
//TODO:鼠標移動時,如果存在有效圖形類型,進行圖形繪制
QGraphicsScene::mouseMoveEvent(e);
if(m_enumShape!=Drawing_Normal)
m_pTempLayer-DrawShape(m_enumShape,m_vetPt,e-scenePos());
}
代碼解析:當鼠標進入到mouseMoveEvent事件后,并且,當前枚舉類型處于有效狀態時,需要實時繪制圖形。
函數DrawShape的講解:
參數1:圖形的枚舉類型,根據不同枚舉,繪制不同的圖形
參數2:vectorQPointF傳入已經記錄的鼠標點,可以是多個,但最少是1個。就例如當前繪制矩形來說,該容器中只是存儲了一個繪制點。
參數3:鼠標在mouseMoveEvent中實時拖動點
DrawShape函數實現代碼,如下:
voidQTempCanvasLayer::DrawShape(ENUM_DrawingGraphicenumShape,std::vectorQPointFvetPt,QPointFptCurrent)
m_pTempCanvasImg-fill(Qt::transparent);
m_pTempPainter-setRenderHint(QPainter::Antialiasing,true);
m_pTempPainter-setCompositionMode(QPainter::CompositionMode_Source);
m_pTempPainter-setPen(QPen(QColor(51,51,51),1,Qt::SolidLine,Qt::SquareCap,Qt::RoundJoin));
switch(enumShape)
caseDrawing_Circular://圓形
break;
caseDrawing_StraightLine://直線
break;
caseDrawing_Rectangular://矩形
m_pTempPainter-drawRect(QRectF(vetPt[0],ptCurrent));
break;
caseDrawing_Triangle://三角形
break;
caseDrawing_ManyLineSegements://多線段
break;
caseDrawing_Curve://曲線
break;
default:
break;
update();
}
代碼講解:switch語句之前的內容都是在設置圖形的風格,比如:setRenderHint防止圖形走樣;最需要我們注意的是下面一句代碼:
m_pTempCanvasImg-fill(Qt::transparent);
如果你忘記設置了,當鼠標在拖動繪制圖形時,會導致拖拽線條重疊的效果,就如下面展示效果一樣,如圖所示:
3:釋放繪制點,繪制最終圖形
鼠標事件:mouseReleaseEvent
voidQCustomQGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent*e)
//TODO:鼠標釋放之后操作
QGraphicsScene::mouseReleaseEvent(e);
if(m_enumShape==Drawing_Normal)
return;
//存在有效的圖形類型,進行最終圖形繪制
if(e-button()Qt::RightButton)
if(m_enumShape==Drawing_Rectangular)
//繪制直線,需要存儲兩個有效點
if(m_vetPt.size()==2)
this-DrawRealShape(m_vetPt);
//如果當前正在繪制圖形,直接清除
this-ClearCurrentDrawingShape();
}
代碼解析:觸發了鼠標釋放事件后,并且是鼠標右鍵點擊(在這里都是以鼠標右鍵點擊作為最終的圖形繪制完成),此時,根據不同的枚舉類型進行圖形繪制。
對于矩形圖形來說,只需要兩個有效的點就會完整對圖形的繪制,其中this-DrawRealShape中進行最終點的繪制。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深化文化國企改革的心得體會
- 2024年秋季九年級語文考核方案計劃
- 高校師生學習傳承紅色基因心得體會
- 六年級下冊綜合實踐活動課本使用計劃
- 二年級學生責任感培養計劃
- 學生違紀處罰執行計劃
- 發熱學生數據統計流程
- 以客戶為導向:重慶水運口岸績效多維剖析與提升策略
- 2024-2025年蘇教版小學數學四年級上冊教學資源計劃
- 高校后勤服務輿情應對職責
- 教育學原理題庫(含答案)
- UL746C標準中文版-2018聚合材料-用于電氣設備評估UL中文版標準
- DB36T 1754-2023 住宅室內裝飾裝修工程質量驗收標準
- 2025《國家安全教育》教學大綱
- 帆狀胎盤的臨床護理
- 外研版(2024)七年級英語上冊++課文中文翻譯
- 心胸外科管理制度
- DB14∕T 2163-2020 信息化項目軟件運維費用測算指南
- 三年級下冊安全教育教案
- Starter Unit 2 Keep Tidy教學設計 2024-2025學年人教版英語七年級上冊
- 簡易呼吸器的使用-
評論
0/150
提交評論