出现错误:必须先构造一个 QGUIApplication

Posted

技术标签:

【中文标题】出现错误:必须先构造一个 QGUIApplication【英文标题】:Getting error : Must construct a QGUIApplication first 【发布时间】:2018-09-18 08:43:41 【问题描述】:

我正在开发一个 GUI 应用程序,但是每当我试图关闭该应用程序时,它都会抛出“必须先构建 QGuiapplication”的错误。我的 main 没有返回退出代码 0,所以它没有正常退出。我认为一些析构函数被调用了两次,但在这里需要一些帮助。我在此处附上 main.cpp 代码以供参考。

#include <QGuiApplication>
#include <QFontDatabase>
#include <QtWebEngine>

#include "ApplicationManager.h"
#include "AppLogger.h"

int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);

    QGuiApplication app(argc, argv);
    QtWebEngine::initialize();

    app.setApplicationName("MCS3.0");
    QFontDatabase::addApplicationFont(":/Fonts/Roboto.ttf");

#ifdef VERSION
    app.setApplicationVersion(QString("%1").arg(VERSION));
    logInfoMessage(app.applicationName()+app.applicationVersion()+" Started");
#endif

    ApplicationManager::instance().run();

    return app.exec();

【问题讨论】:

那个错误信息完成了吗?因为我在源代码中找不到。 @Jiu 还在。 我是说Qt源码,我只找到github.com/qt/qtbase/blob/… 请编辑您的问题以显示准确错误消息。这些类型的消息通常是尝试创建/初始化QObject 派生类的实例 main 开始之前的结果——通常是在别处定义的某些描述的静态全局。跨度> 错误信息与我在标题中发布的相同。 @GM .好的,我去看看代码。 【参考方案1】:

问题的相关部分在ApplicationManager.h 内部,OP 没有暴露。

我敢打赌,它会生成另一个 QApplication(或 QGUIApplicationQCoreApplication)实例。

我怎么知道这个?这部分是猜测(就像名字一样),部分是以下测试的结果:

testQApp.cc:

#include <QtWidgets>

int main(int argc, char **argv)

  QApplication app(argc, argv);
   QApplication app(argc, argv);
    QLabel qLbl("The app in app");
    qLbl.show();
    app.exec();
  
  return app.exec();

testQApp.pro:

SOURCES = testQApp.cc

QT = widgets

在 Windows 10 上的 cygwin64 中编译和测试:

$ qmake-qt5 testQApp.pro

$ make

$ ./testQApp 

当我退出应用程序时,出现问题:

QApplication::exec: Please instantiate the QApplication object first
Segmentation fault (core dumped)

$

为了使这一点完整,doc.的相关段落。关于QApplication

对于任何使用 Qt 的 GUI 应用程序,精确地有 一个 QApplication 对象,无论应用程序在任何给定时间是否有 0、1、2 或更多窗口。对于非基于QWidget 的Qt 应用程序,请改用QGuiApplication,因为它不依赖于QtWidgets 库。

请注意,重点不是我做的

【讨论】:

以上是关于出现错误:必须先构造一个 QGUIApplication的主要内容,如果未能解决你的问题,请参考以下文章

错误:已经有一个与此命令关联的打开DataReader,必须先关闭它。多个用户

super注意点

super注意点

已经有一个打开的 DataReader 与此命令关联,必须先关闭

房间持久性:错误:实体和 Pojos 必须有一个可用的公共构造函数

如何构造一个合适的 foreach()