一、前言
本篇文章是QGIS3.10二次开发的第三个文档,可在本人首页查看所有QGIS3.10二次开发相关的文档,文档不定期更新。
https://blog.csdn.net/qfl_sdu?type=blog
本篇文章计划实现以下功能:
- 图层控制器右键菜单
- 通过右键菜单控制图层标签(label)的显示及显示的内容
- 通过右键菜单控制点图层的渲染效果
- 通过右键菜单控制线图层的渲染效果
- 通过右键菜单控制多边形图层的渲染效果
这一节的内容较多,因个人工作原因,内容会逐步补充完整,前面2个功能已经实现,后面3个功能会逐渐补充上来。
按照惯例,先上效果图:(效果图中添加了一个点图层,一个面图层,只截取了点图层的示例,面图层的操作相同就不再截图了)
二、图层控制器右键菜单
在上一篇文章中已经添加了图层控制器,此处说明在其基础上增加右键菜单。
(上篇链接:https://blog.csdn.net/qfl_sdu/article/details/113184043)
在QGis中,图层控制器右键菜单有个专门的抽象类QgsLayerTreeViewMenuProvider,通过继承这个类并实现 createContextMenu()这个方法,即可添加右键菜单。
在工程中添加一个类文件MyGistreeviewMenu.h和MyGistreeviewMenu.cpp,并继承QgsLayerTreeViewMenuProvider类,代码如下:
MyGistreeviewMenu.h代码:
#ifndef MYGISTREEVIEWMENU_H
#define MYGISTREEVIEWMENU_H
#include <QObject>
#include "qgslayertreeview.h"
#include "qgsmaplayer.h"
class QAction;
class QgsMapCanvas;
class MyGistreeviewMenu : public QObject, public QgsLayerTreeViewMenuProvider
{
Q_OBJECT
public:
MyGistreeviewMenu(QgsLayerTreeView* view,QgsMapCanvas* canvas);
~MyGistreeviewMenu() override;
QMenu * createContextMenu() override; // 创建菜单
private:
QgsLayerTreeView* m_layerTreeView;
QgsMapCanvas* m_mapCanvas;
};
#endif // MYGISTREEVIEWMENU_H
MyGistreeviewMenu.cpp代码:
#include "mygistreeviewmenu.h"
#include "mainwindow.h"
#include <QMenu>
#include <QModelIndex>
#include <QIcon>
#include <qgswkbtypes.h>
//QGIS include
#include "qgslayertreeviewdefaultactions.h"
#include "qgslayertreenode.h"
#include "qgslayertreemodel.h"
#include "qgslayertree.h"
#include "qgsrasterlayer.h"
#include "qgsvectorlayer.h"
MyGistreeviewMenu::MyGistreeviewMenu(QgsLayerTreeView* view,QgsMapCanvas* canvas)
{
m_layerTreeView = view;
m_mapCanvas = canvas;
}
MyGistreeviewMenu::~MyGistreeviewMenu()
{
}
//创建菜单
QMenu *MyGistreeviewMenu::createContextMenu()
{
QMenu* menu = new QMenu;
QgsLayerTreeViewDefaultActions* actions = m_layerTreeView->defaultActions();
QModelIndex idx = m_layerTreeView->currentIndex();
// global menu
if(!idx.isValid())
{
menu->addAction(actions->actionAddGroup(menu));
menu->addAction(tr("&Expand All"),m_layerTreeView,SLOT(expandAll()));
menu->addAction(tr("&Collapse All"),m_layerTreeView,SLOT(collapseAll()));
}else
{
QgsLayerTreeNode* node = m_layerTreeView->layerTreeModel()->index2node(idx);
//layer or group selected
if(QgsLayerTree::isGroup(node))
{
menu->addAction(actions->actionZoomToGroup(m_mapCanvas,menu));
menu->addAction(actions->actionRemoveGroupOrLayer(menu));
menu->addAction(actions->actionRenameGroupOrLayer());
if(m_layerTreeView->selectedNodes(true).count() >= 2)
menu->addAc