Qt - QWidget:在未使用GUI时无法创建QWidget

13

我试图运行一个简单的Qt程序,但是在运行时,我得到了一个控制台窗口,上面显示:QWidget: Cannot create a QWidget when no GUI is being used,还有第二行This application has requested the Runtime to terminate.....,因此.exe文件停止工作。

我的.pro文件如下:

#-------------------------------------------------
#
# Project created by QtCreator 2011-04-02T07:38:50
#
#-------------------------------------------------

QT       += core

QT       += gui

TARGET = Hello
CONFIG += console
CONFIG += qt
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

有什么想法吗?

谢谢。

5个回答

18

问题不在这个.pro文件中,而很可能是在main.cpp文件中。Qt要求你在创建任何QWidget子类(以及其他特定的类,如QPixmap)之前先创建一个QApplication。你的main函数应该以以下行开始:

QApplication app(argc, argv);

最后可能会以这样一行结束:

return app.exec();

在这些调用之间,您应该创建并显示您的主窗口。


12

我发现您可以使用Qt控制台项目进行操作,但当您完成我的编辑后,它当然不会具有控制台程序的功能。

首先,您需要在您启动应用程序的main.cpp中,将#include <QtCoreApplication>更换为#include <QApplication>

main(int,char**){中:

QCoreApplication a(argc, argv);更换为QApplication a(argc, argv);

并且在QApplication和return a.exec之间,您需要编写有关小部件和其他GUI相关内容的代码。

最后使用return a.exec();}


3

我觉得我找到了问题所在。

由于我使用的是Qt Creator,当创建一个新项目时,我选择了Qt控制台应用程序而不是Qt图形用户界面应用程序


1
是的,Qt控制台应用程序将创建非GUI的QtCoreApplication并为您启动控制台。您应该使用QtApplication代替。 - winterTTr
另外需要注意的是:GUI 需要 QApplicationQT+=gui,而控制台则需要使用 QCoreApplicationCONFIG+=console。无论如何链接,你都不能使用 QT+=gui 来显示控制台。(你可以有两个可执行文件,或者让一个调用另一个,或者从你的 GUI 应用程序中实现自己的类似控制台的东西。) - charley
我的问题也一样。将"QtCoreApplication"更改为"QtApplication"后,它就起作用了。 - Kamran Bigdely

2
"QWidget: Cannot create a QWidget when no GUI is being used" 出现在您的应用程序不是 QApplication 实例时。来自 Qt 文档

QApplication 为基于 QWidget 应用程序提供了一些功能,它是 QGuiApplication 的专用版本。它处理小部件特定的初始化、终止和提供会话管理。

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


0
从文档中可以看到,QApplication类管理GUI应用程序的控制流和主要设置,而QCoreApplication类为控制台Qt应用程序提供事件循环。
我之前遇到了同样的问题,QT控制台应用程序默认使用QCoreApplication而不是QApplication来运行应用程序。
以下是我采取的解决方法。
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget widget;

    widget.show();

    return a.exec();
}

而且我没有在我的项目文件中做任何更改

QT       += core

QT       += gui

TARGET = Layouts
CONFIG   += gui
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接