由某位朋友需求,在设置了地图控件之后,怎么才能将当前的地图工具释放掉,返回原来的空地图状态。比如刚刚打开程序的时候,鼠标指针是一个箭头,表示没有地图工具,也不能在地图上直接操作。而点选某个地图工具后(例如漫游工具,鼠标指针会变成一个小手),现在想释放掉这个设置的地图工具。
这个需求我之前没有想到过,大多数时候我都是直接选择漫游工具来释放其他的地图工具。而看到这个需求我的一反应就是将 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 );
本文注定很短。