QGIS 应用程序:必须在 QWidget 之前构建 QApplication

问题描述 投票:0回答:1

我使用网络安装程序安装了最新版本(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
官方文档和代码示例,他们到处都以类似的方式启动应用程序。

c++ qt qt5 gis qgis
1个回答
0
投票

好吧,看看我创建和使用的这个示例

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

© www.soinside.com 2019 - 2024. All rights reserved.