这个话题有很多答案。 0.0
所以我用 Qt5.x 从 Win7 到 Win10 进行了尝试。我花了 几个小时 才找到一个不会在链中某处产生任何问题的有效解决方案:
#include "mainwindow.h"
#include <QApplication>
#include <windows.h>
#include <stdio.h>
#include <iostream>
//
// Add to project file:
// CONFIG += console
//
int main( int argc, char *argv[] )
{
if( argc < 2 )
{
#if defined( Q_OS_WIN )
::ShowWindow( ::GetConsoleWindow(), SW_HIDE ); //hide console window
#endif
QApplication a( argc, argv );
MainWindow *w = new MainWindow;
w->show();
int e = a.exec();
delete w; //needed to execute deconstructor
exit( e ); //needed to exit the hidden console
return e;
}
else
{
QCoreApplication a( argc, argv );
std::string g;
std::cout << "Enter name: ";
std::cin >> g;
std::cout << "Name is: " << g << std::endl;
exit( 0 );
return a.exec();
}
}
我也尝试过没有“CONFIG += 控制台”,但是您需要重定向流并自行创建控制台:
#ifdef _WIN32
if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()){
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
freopen("CONIN$", "r", stdin);
}
#endif
但是这仅在您通过调试器启动时才有效,否则所有输入也都指向系统。意味着,如果您通过 std::cin 键入名称,系统会尝试将该名称作为命令执行。 (很奇怪)
另外两个警告是,你不能使用 ::FreeConsole() 它不会关闭它,如果你通过控制台启动它,应用程序也不会关闭.
最后有一个Qt help section in QApplication 指向此主题。我在那里用一个应用程序尝试了该示例,它不适用于 GUI,它卡在了一个无限循环中的某个地方,并且 GUI 不会被渲染或者它只是崩溃:
QCoreApplication* createApplication(int &argc, char *argv[])
{
for (int i = 1; i < argc; ++i)
if (!qstrcmp(argv[i], "-no-gui"))
return new QCoreApplication(argc, argv);
return new QApplication(argc, argv);
}
int main(int argc, char* argv[])
{
QScopedPointer<QCoreApplication> app(createApplication(argc, argv));
if (qobject_cast<QApplication *>(app.data())) {
// start GUI version...
} else {
// start non-GUI version...
}
return app->exec();
}
因此,如果您使用的是 Windows 和 Qt,只需使用控制台选项,如果您需要 GUI,请隐藏控制台并通过退出关闭它。