QGIS二次開發-新建工程並顯示一個圖層
一、環境
開發環境為VS2019+Qt14,編譯器為MSVC【MingW在windows下的動態庫為.a檔案,但是直接現在的現成的qgis動態庫是dll的,所以選擇msvc,以免麻煩】
配置vs+qt環境,參考:https://www.cnblogs.com/judes/p/8992231.html
二、安裝QGIS相關
1、安裝桌面版【只是使用Qt開發的一個工具,可以用來玩玩,只要這個工具有的功能,理論上實都能通過二次開發QGIS庫開發出來】,參考:https://www.cnblogs.com/judes/p/15143756.html
2、安裝好桌面版之後,需要下載QGIS執行庫【後續二次開發所依賴的庫】,開啟配置工具
3、按照下圖依次下一步
這裡需要注意下,我最開始按照其他部落格選擇最後一個,但是下載失敗,一直提示license有問題,選擇第二個就ok了
然後等待下載,會比較慢,我在家裡是每秒幾百k,大概等了半小時
3、下載完成
後面二次開發的依賴就在這裡面
如果不想自己下載安裝這麼多東西,也可以直接網上找現成的編譯好了的依賴庫,我就是這樣做的【下文也按照此路徑進行配置】,下載來是這樣的:
跟上面差不多。此外也可以網上找如何對QGIS進行原始碼編譯的方法,是基於CMake的,如果是跨環境估計就得用這方法了。
三、下載地圖瓦片資料
qgis的的瓦片資料型別是shp的,可在此網站下載:http://download.geofabrik.de/,下載下來裡面有很多,如建築、學校、工廠等等,這裡做實驗隨便留一個備用
四、新建工程及環境配置
1、開啟vs,新建Qt gui widget工程,原始檔如下:
2、右鍵專案,為專案新增svg和xml的Qt模組
為啥要加這模組呢,是因為QGis原始碼裡會用到。
3、設定附加包目錄【標頭檔案目錄】
D:\soft\OSGeo4W64\include
D:\soft\OSGeo4W64\apps\qgis-ltr\include
4、設定附加庫目錄【lib檔案的目錄】
D:\soft\OSGeo4W64\apps\qgis-ltr\lib
5、設定附加依賴項【依賴的dll動態庫】
qgis_core.lib
qgis_app.lib
qgis_gui.lib
6、編譯程式生成exe【必須是64位和release,64位是因為要與QGis位數一致】
7、將相關動態庫放到exe同一路徑,以免執行失敗
①、路徑1的dll
D:\soft\OSGeo4W64\apps\qgis-ltr\bin
D:\soft\OSGeo4W64\bin
②、路徑2的dll
D:\soft\OSGeo4W64\apps\Qt5\bin
③、路徑3的資料夾
D:\soft\OSGeo4W64\apps\Qt5\plugins下的整個platforms資料夾
最終可執行資料夾是這樣的:
注意都要複製,不然後面程式碼寫了也不能執行,會報無dll錯誤和Qtplatforms錯誤。至此二次開發環境就ok了。
五、程式碼編寫
1、qtwidgetsapplication.h
#pragma once #include <QtWidgets/QMainWindow> #include "ui_qtwidgetsapplication.h" #include <qmenu.h> #include <qaction.h> #include <qgsmapcanvas.h> class QtWidgetsApplication : public QMainWindow { Q_OBJECT public: QtWidgetsApplication(QWidget *parent = Q_NULLPTR); private: Ui::QtWidgetsApplicationClass ui; QMenu* fileMenu; QAction* openFileAction; QgsMapCanvas* mapCanvas; QList<QgsMapLayer*> layers; public slots: void on_openFileAction_triggered(); // public: void addVectorLayer(); };
2、qtwidgetsapplication.cpp
#include "qtwidgetsapplication.h" #include <qmenubar.h> #include <qmessagebox.h> #include <qfiledialog.h> #include <qgsvectorlayer.h> QtWidgetsApplication::QtWidgetsApplication(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); this->resize(600, 400); // create the menus and then add the actions to them. fileMenu = this->menuBar()->addMenu("File"); openFileAction = new QAction("Open", this); this->connect(openFileAction, SIGNAL(triggered(bool)), this, SLOT(on_openFileAction_triggered())); fileMenu->addAction(openFileAction); // initialize the map canvas mapCanvas = new QgsMapCanvas(); this->setCentralWidget(mapCanvas); mapCanvas->setCanvasColor(QColor(255, 255, 255)); mapCanvas->setVisible(true); mapCanvas->enableAntiAliasing(true); } void QtWidgetsApplication::on_openFileAction_triggered() { addVectorLayer(); } void QtWidgetsApplication::addVectorLayer() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*.shp"); //QString fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*"); QStringList temp = fileName.split('/'); QString basename = temp.at(temp.size() - 1); QgsVectorLayer* vecLayer = new QgsVectorLayer(fileName, basename, "ogr"); if (!vecLayer->isValid()) { QMessageBox::critical(this, "error", QString("layer is invalid: \n") + fileName); return; } mapCanvas->setExtent(vecLayer->extent()); layers.append(vecLayer); mapCanvas->setLayers(layers); mapCanvas->refresh(); }
3、main.cpp
#include "qtwidgetsapplication.h" #include <QtWidgets/QApplication> #include <qgsapplication.h> int main(int argc, char *argv[]) { QApplication a(argc, argv); QtWidgetsApplication w; w.show(); return a.exec(); }
原理就是在mainwindow裡,增加一個點選action,點選後開啟shp檔案,並將檔案存到記憶體裡,然後依次繪製到畫布中。
長風破浪會有時,直掛雲帆濟滄海!
可通過下方連結找到博主
https://www.cnblogs.com/judes/p/10875138.html