1. 程式人生 > >QGis二次開發基礎 -- 銷燬當前地圖工具

QGis二次開發基礎 -- 銷燬當前地圖工具

本文註定很短。

由某位朋友需求,在設定了地圖控制元件之後,怎麼才能將當前的地圖工具釋放掉,返回原來的空地圖狀態。比如剛剛開啟程式的時候,滑鼠指標是一個箭頭,表示沒有地圖工具,也不能在地圖上直接操作。而點選某個地圖工具後(例如漫遊工具,滑鼠指標會變成一個小手),現在想釋放掉這個設定的地圖工具。
這個需求我之前沒有想到過,大多數時候我都是直接選擇漫遊工具來釋放其他的地圖工具。而看到這個需求我的一反應就是將 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 );

本文註定很短。