学习笔记,主要用于记录学习过程,及解决问题。如有侵权,请联系我。
前言
本人是一名在校学生,应学校要求,学习QT+QGIS,进行简单的遥感应用实现。
一、学习环境
Windows10+VS2022+QT5.14.2+QGIS3.22.14
二、参考文章
QGIS二次开发环境配置
其中,VS+QT环境较为简单,但QGIS的二次开发环境属实困难要下很多次,一不注意时间就从指尖溜走了。
便捷下载:
QT5.14.2:http://t.csdn.cn/CtIeM(其他博主)
QT安装想好都会要什么功能,维护时再加组件太难了
osgeo4W太难装了,给个自己的环境敢的可以直接用(优快云一个资源限制只有1G):
QGIS3.22.12 免安装(1)
QGIS3.22.12 免安装(2)
QGIS3.22.12 免安装(3)
QGIS3.22.12 免安装(4)
QGIS3.22.12 免安装(5)
链接:https://pan.baidu.com/s/1x8MgeeMoYjP_8rZYvS4UdA?pwd=0997
三、测试环境
main文件修改:
#include "Qt_QGIS.h"
#include <QtWidgets/QApplication>
#include<qgsapplication.h>
int main(int argc, char *argv[])
{
/*QApplication a(argc, argv);*/
QgsApplication a(argc, argv, true);
QgsApplication::setPrefixPath("D:/QT/OSGeo4W/apps/qgis-ltr", true);
QgsApplication::initQgis();
Qt_QGIS w;
w.show();
return a.exec();
}
头文件修改:
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_Qt_QGIS.h"
#include<QgsRasterLayer.h>
#include<QgsMapCanvas.h>
#include<QMessageBox>
#include<qgseditorwidgetregistry.h>
#include<qgslayertreemapcanvasbridge.h>
#include<QFileDialog.h>
#include<qDebug.h>
class Qt_QGIS : public QMainWindow
{
Q_OBJECT
public:
QgsMapCanvas* mapCanvas;
QgsLayerTreeMapCanvasBridge* bridge;
Qt_QGIS(QWidget *parent = nullptr);
~Qt_QGIS();
void initMap(QWidget* parent);
void addProject(QString projectPath);
void addRaster(QString rasterPath);
void addVector(QString vectorPath);
private:
Ui::Qt_QGISClass ui;
};
cpp文件修改:
#include "Qt_QGIS.h"
Qt_QGIS::Qt_QGIS(QWidget* parent)
: QMainWindow(parent)
{
ui.setupUi(this);
initMap(ui.widget);
addProject("E:\\Temp\\test.qgz");
addRaster("E:\\RSdata\\GF_test.tif");
addVector("E:\\RSdata\\GF_NBC.shp");
}
Qt_QGIS::~Qt_QGIS()
{}
void Qt_QGIS::initMap(QWidget* parent)
{
mapCanvas = new QgsMapCanvas(parent);
QGridLayout* pLayout = new QGridLayout(parent);
pLayout->addWidget(mapCanvas, 0, 0, 1, 1);
}
void Qt_QGIS::addProject(QString projectPath)
{
QgsProject::instance()->read(projectPath);
QgsEditorWidgetRegistry a;
a.initEditors(mapCanvas);
bridge = new QgsLayerTreeMapCanvasBridge(QgsProject::instance()->layerTreeRoot(), mapCanvas, this);
}
void Qt_QGIS::addRaster(QString rasterPath)
{
QgsRasterLayer* rasterLayer = new QgsRasterLayer(rasterPath, "raster", "gdal");
if (rasterLayer->isValid()) {
QgsProject::instance()->addMapLayer(rasterLayer);
mapCanvas->refresh();
}
else {
QMessageBox::critical(this, "error", "open raster file error");
}
}
void Qt_QGIS::addVector(QString vectorPath)
{
QgsVectorLayer* rasterLayer = new QgsVectorLayer(vectorPath, "Vector", "ogr");
if (rasterLayer->isValid()) {
QgsProject::instance()->addMapLayer(rasterLayer);
mapCanvas->refresh();
}
else {
QMessageBox::critical(this, "error", "open shape file error");
}
}
遗留问题
1、环境中dll太多了,每次新建项目都需要重新拷贝,耗内存。尝试利用系统环境减少复杂程度,未果!T_T
2、无法采用Qt Create进行设计,环境配置无法运行,报错无法解析的内部指令。