基於Qt的流程設計器(一)


一:
先來看一下界面的截圖:
 
說明:
拖動節點的時候,與該節點相關的箭頭連線也會跟着調整;
用戶可以使用鼠標從一個節點拖出一個箭頭到另一個節點(鼠標在空白區域點擊一下,拖出的箭頭消失)
 
這三個圖標,手型圖標處於選中狀態的時候,節點可以拖動,
箭頭圖標處於選中狀態的時候,可以使用鼠標繪制連線箭頭
最后一個圖標,用於在畫布上創建一個節點方框
 
二:
關鍵代碼文件如下圖(用紅框框住的為關鍵代碼文件)
其他文件均為輔助代碼文件(有些文件中的代碼沒有用到)
 
三:
CustomView類是我們的繪圖面板,這個類繼承自 QGraphicsView
在這個類的構造函數中,我們創建了他的 QGraphicsScene
並設置了它的大小(這也是為什么我們的繪圖板有滾動條的原因)
另外需要注意的是QGraphicsScene的坐標原點在中心位置,如下圖所示
 
 
四:
CustomArrow是描述箭頭連線的類:
這個類繼承自 QGraphicsItem
boundingRect是 QGraphicsItem的虛函數,必須要實現,
其中1.5是箭頭連線的線寬,8是箭頭張開后所占的區域寬度
p1是箭頭的起始點,p2是箭頭結束點(也就是帶箭頭的那一端)
最終返回的一個Rect結構如下圖所示:(注意箭頭的起點,在上一個方框的中心點上)
 
五:
我給CustomArrow類公開了一個adjust函數,旨在當方框節點移動的時候,重新計算箭頭的起始位置、結束位置、箭頭的角度
代碼如下:
 
其中:itemA是起始處的方框節點,itemB是結束處的方框節點
注意mapFromItem是把方框節點中心點映射到scene坐標系中
緊接着的if,else是為了判斷起始方框是否位於結束方框的下方,如果是,那么箭頭的終點應該在結束方框的下邊框上
接下來是計算出箭頭的兩個點arrowP1和arrowP2
 
六:
繪制箭頭的工作是在CustomArrow的paint函數中完成的,代碼如下所示
箭頭只不過是一個多邊形,用drawPolygon畫出來的
 
七:
CustomRect繼承自 QGraphicsRectItem
在這個類型中,我們重載了itemChange函數,代碼如下
當當前方框節點移動后,與這個節點相關的箭頭都要跟着移動
Arrows就是與當前方框節點有關的箭頭
 
八:
在來看一下CustomRect的MousePressEvent的代碼
在這個代碼中,
我們先為全局標志ScenClickFlag賦值,
這個標志着當前點擊的是一個方框節點,還是點擊在畫布的空白處了
接下來判斷箭頭按鈕是不是處於選中狀態
再往下判斷是不是已經記錄了起始方框,如果沒記錄,那么就記錄並返回
再接下來,就意味着用戶是點擊的結束方框,這時要繪制一個箭頭了,
當然首先要判斷是不是已經存在了同樣的箭頭,如果存在了,就沒必要再繪制了,
ScenClickFlag置成true是為了冒泡觸發畫布的點擊事件(后續會講為什么要允許事件冒泡)
接下來執行了繪制箭頭的邏輯,並在起始節點和結束節點分別記錄了箭頭的指針
以后這兩個節點移動的時候,箭頭也會跟着移動了。
 
 
 
未完待續,喜歡的話請點推薦(您的支持,是我的動力)--------------------->
代碼會在下一篇文章中發布
 
 


免責聲明!

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



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