最近在查看QGIS源码,经过几天的努力把基本功能实现了,界面如下:
其中基本功能包括新建、打开项目、打开矢量文件、打开栅格文件、保存、另存为、漫游、识别、放大、缩小、全图、二次开发帮助、图层管理。因为map工具的实现方式基本都是一样,所以只实现这几个,可还对照源码实现其他功能。
一、文件功能
文件功能可以参照我以前的博客。
二、漫游、识别、放大、缩小、全图
1.工具的创建
//pan工具
mPan = new QgsMapToolPan(canvas);
//识别工具
mIdentify = new myIdentify(canvas);
//zoomIn
mZoomIn = new QgsMapToolZoom(canvas, false);
//zoomOut
mZoomOut = new QgsMapToolZoom(canvas, true);
2.工具的实现,canvsa是自定义的画布
canvas->setMapTool(mPan);
canvas->setMapTool(mIdentify);
canvas->setMapTool(mZoomIn);
canvas->setMapTool(mZoomOut);
canvas->zoomToFullExtent();
三、二次开发帮助
点击后会打开一个网页,网页的网址可能自定义
QDesktopServices::openUrl(QUrl(QLatin1String("https://blog.csdn.net")));
四、图层管理
1.首先初始化图层管理器
//图层管理器初始化
m_layerTreeView = new QgsLayerTreeView(this);
model = new QgsLayerTreeModel(QgsProject::instance()->layerTreeRoot(), this);
model->setFlag(QgsLayerTreeModel::AllowNodeRename);
model->setFlag(QgsLayerTreeModel::AllowNodeReorder);
model->setFlag(QgsLayerTreeModel::AllowNodeChangeVisibility);
model->setFlag(QgsLayerTreeModel::ShowLegendAsTree);
model->setAutoCollapseLegendNodes(10);
m_layerTreeView->setModel(model);
//连接画布
m_layerTreeMapCanvasBridge = new QgsLayerTreeMapCanvasBridge(QgsProject::instance()->layerTreeRoot(), canvas, this);
// 右键菜单
m_layerTreeView->setMenuProvider(new myQgisLayerTreeViewMenuProvider(m_layerTreeView, canvas));
// DOCK窗口菜单
ui.dockWidget->setWindowTitle("图层管理");
2.添加右键功能
上面的myQgisLayerTreeViewMenuProvider类,是自定义,并且继承抽象类QgsLayerTreeViewMenuProvider,右键功能实现方式一样,下面是实现“缩放至图层”,QGIS的图层管理自带这些默认的功能,实例化这些功能的方式为
QgsLayerTreeViewDefaultActions *actions = mView->defaultActions();//mView为实例化的QgsLayerTreeView
QAction *zoomToLayer_action = actions->actionZoomToLayer(mCanvas, meun);
zoomToLayer_action->setText("&缩放至图层");
meun->addAction(zoomToLayer_action);