出现错误:必须先构造一个 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
(或 QGUIApplication
或 QCoreApplication
)实例。
我怎么知道这个?这部分是猜测(就像名字一样),部分是以下测试的结果:
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,必须先关闭它。多个用户
已经有一个打开的 DataReader 与此命令关联,必须先关闭