QML中的地图模块提供了大量的功能函数供用户使用,使用起来也很顺手,但是如果想在已经提供了功能函数基础上自己新增功能,比如Map提供了添加/删除地图中组件的函数:
- void addMapItemView(MapItemView itemView)
- void removeMapItemView(MapItemView itemView)
此时我们想新增一个直接删除当前地图上所有已存在的MapItemView的函数时,就需要修改Map的源码,在源码中新增该函数,如需要修改其他模块的源码,方法类似,具体操作流程如下:
第一步:打开源码所在位置的工程文件
在Qt的安装目录下,找到并打开Map对应的工程文件“..\Qt\5.11.2\Src\qtlocation\src\location\location.pro”,其中Map控件对应的文件为工程目录下的“declarativemaps\qdeclarativegeomap_p.h”“declarativemaps\qdeclarativegeomap.cpp”,在头文件即可看到所有Map提供的属性和功能代码,其中添加/删除地图组件函数为:
第二步:添加功能函数
在头文件中新增函数:
Q_INVOKABLE void removeAllMapItemView();
头文件新增信号:
void mapItemViewChanged();
在源文件中定义函数:
void QDeclarativeGeoMap::removeAllMapItemView()
{
for(QDeclarativeGeoMapItemView * itemView : m_mapViews){
if (!itemView || itemView->m_map != this) // can't remove a view that is already added to another map
return;
itemView->removeInstantiatedItems();
itemView->m_map = 0;
emit mapItemViewChanged();
}
m_mapViews.clear();
}
第三步:将修改好的源码编译成库文件
此时直接对工程进行构建,此时构建失败,提示
LINK : fatal error LNK1104: 无法打开文件“poly2trid.lib”
通过查看location.pro和declarativemaps.pri,工程中引用到了名为“clip2tri”、“poly2tri”、“clip2tri”三个库,这三个库位于“..:\Qt\5.11.2\Src\qtlocation\src\3rdparty\”目录下,分别打开对应文件夹下的工程文件,编辑构建即可,此时在Qt安装所在的盘(我的是F盘)的根目录下会多了一个lib文件夹和bin文件夹,里面就有新构建好的库文件。
此时重新构建location工程,无报错,库文件成功至lib文件夹和bin文件,如图:
第四步:替换原Qt原有的库文件
Qml中原有的Map的库文件路径:“..:\Qt\5.11.2\msvc2015\bin”和“..:\Qt\5.11.2\msvc2015\lib”,将编译好的.dll文件和.lib文件分别复制替换原文件即可
第五步:在Qml中使用新增的功能
MouseArea{
anchors.fill: parent
onClicked: {
myMap.removeAllMapItemView()
}
}
Connections{
target: myMap
onMapItemViewChanged:{
console.log("地图控件已被修改")
}
}