我使用网络安装程序安装了最新版本(3.28)的 qgis。根据文档,我们需要在执行任何操作之前实例化
QgsApplication
而不是 QApplication
。 QgsApplication
是 QApplication
的子类。这是我的 main
功能:
int main(int argc, char *argv[])
{
QgsApplication a(argc, argv, true);
QgsApplication::setPrefixPath("C:/OSGeo4W/apps/qgis", true);
QgsApplication::initQgis();
QWidget w;
w.showMaximized();
return a.exec();
}
它编译没有任何问题,但是当我运行它时,我收到错误
QWidget: Must construct a QApplication before a QWidget
并且应用程序退出。
我尝试切换多个
Qgis
版本。我检查了 Qgis
官方文档和代码示例,他们到处都以类似的方式启动应用程序。
好吧,看看我创建和使用的这个示例
QgsApplication
。
你不需要QWidget
,你需要QgsMapCanvas
!
QgsMapCanvas继承自
QGraphicsView
,是QGIS地图的基础。
#include <qgsapplication.h>
#include <qgsmapcanvas.h>
#include <qgsmaplayer.h>
#include <qgsrasterlayer.h>
int main(int argc, char **argv)
{
// Start the QGIS application
QgsApplication app(argc, argv, true);
QgsApplication::setPluginPath("/usr/lib64");
QgsApplication::setPrefixPath("/usr", true);
QgsApplication::setPkgDataPath("/usr/share/qgis");
app.initQgis();
// Create a map canvas
QgsMapCanvas *canvas = new QgsMapCanvas();
canvas->setWindowTitle("QGIS");
canvas->resize(800, 600);
// Show the canvas
canvas->show();
// Start the application loop
return app.exec();
}
如果你想将 MapCanvas 放入 Widget 中,你可以这样做:
#include <QGridLayout>
#include <qgsapplication.h>
#include <qgsmapcanvas.h>
#include <qgsmaplayer.h>
#include <qgsrasterlayer.h>
int main(int argc, char **argv)
{
// Start the QGIS application
QgsApplication app(argc, argv, true);
QgsApplication::setPluginPath("/usr/lib64");
QgsApplication::setPrefixPath("/usr", true);
QgsApplication::setPkgDataPath("/usr/share/qgis");
app.initQgis();
// Create a map canvas
QgsMapCanvas *canvas = new QgsMapCanvas();
canvas->setWindowTitle("Load TMS map like OSM in QGIS");
QWidget w;
QGridLayout *layout = new QGridLayout(&w);
w.resize(800, 600);
layout->setContentsMargins(0, 0, 0, 0);
w.layout()->addWidget(canvas);
w.showMaximized();
return app.exec();
}
这是我的
.pro
文件:
QT += core gui xml
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
INCLUDEPATH += /usr/include/qgis
LIBS += -lqgis_core -lqgis_gui -lqgis_analysis -lqgis_app
SOURCES += \
main.cpp
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target