本文註定很短。
由某位朋友需求,在設置了地圖控件之後,怎麼才能將當前的地圖工具釋放掉,返回原來的空地圖狀態。比如剛剛打開程序的時候,鼠標指針是一個箭頭,表示沒有地圖工具,也不能在地圖上直接操作。而點選某個地圖工具後(例如漫遊工具,鼠標指針會變成一個小手),現在想釋放掉這個設置的地圖工具。
這個需求我之前沒有想到過,大多數時候我都是直接選擇漫遊工具來釋放其他的地圖工具。而看到這個需求我的一反應就是將 mapTool 設置爲 null 就行了。但是那個朋友實驗之後反饋給我說不行。於是我自己打開工程,簡單撥弄了幾下。
原來 QgsMapCanvas 自帶的 mapTool 在初始化時,並不是null,而是沒有值。
而當點選了某個工具之後,這個指針纔會被創建並附上相應的值。
使用 NULL 去替換這個 mapTool 指針是不行的,因爲如果不是合法的 QgsMapTool 對象,QGis會將這次替換動作忽略掉。
(截圖來自 QGis 源碼 qgsmapcanvas.cpp 文件)
那是不是就沒辦法切換回原來的無地圖工具狀態呢?
也不是的,QgsMapCanvas 對象提供了一個叫 unsetMapTool() 的功能,這個功能平時是不需要開發者自己調用的,因爲你切換工具的時候,QGis會自動調用這個方法釋放掉之前的地圖工具。
所以,我們想要切換回到原來的無地圖工具狀態,解決思路就有了。先獲取到當前的地圖工具,然後 unset 掉它,並不設置新的工具,就可以了。代碼如下:
QgsMapTool *lastMapTool = m_mapCanvas->mapTool();
m_mapCanvas->unsetMapTool( lastMapTool );
本文註定很短。