Rob*_*Rob 47 c++ windows qt qt4
我有一个在Windows上运行的Qt GUI应用程序,它允许传递命令行选项,在某些情况下我想向控制台输出一条消息,然后退出,例如:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (someCommandLineParam)
{
std::cout << "Hello, world!";
return 0;
}
MainWindow w;
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我从命令提示符运行应用程序时,不会显示控制台消息.有谁知道我怎么能让这个工作?
Dav*_*ben 46
Windows并不真正支持双模式应用程序.
要查看控制台输出,您需要创建一个控制台应用程序
CONFIG += console
Run Code Online (Sandbox Code Playgroud)
但是,如果您双击该程序以启动GUI模式版本,那么您将出现一个控制台窗口,这可能不是您想要的.要防止出现控制台窗口,您必须创建一个GUI模式应用程序,在这种情况下,您不会在控制台中输出任何内容.
一个想法可能是创建第二个小应用程序,它是一个控制台应用程序并提供输出.这可以调用第二个来完成工作.
或者你可以将所有功能放在DLL中,然后创建两个版本的.exe文件,它们具有调用DLL的非常简单的主要功能.一个用于GUI,一个用于控制台.
pat*_*tew 12
加:
#ifdef _WIN32
if (AttachConsole(ATTACH_PARENT_PROCESS)) {
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
}
#endif
Run Code Online (Sandbox Code Playgroud)
在顶部main().仅当程序在控制台中启动时才会启用到控制台的输出,并且在其他情况下不会弹出控制台窗口.如果要在控制台外运行应用程序时创建控制台窗口以显示消息,可以将条件更改为:
if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())
Run Code Online (Sandbox Code Playgroud)
void Console()
{
AllocConsole();
FILE *pFileCon = NULL;
pFileCon = freopen("CONOUT$", "w", stdout);
COORD coordInfo;
coordInfo.X = 130;
coordInfo.Y = 9000;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coordInfo);
SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE),ENABLE_QUICK_EDIT_MODE| ENABLE_EXTENDED_FLAGS);
}
int main(int argc, char *argv[])
{
Console();
std::cout<<"start@@";
qDebug()<<"start!";
Run Code Online (Sandbox Code Playgroud)
你不能像其他人所说的那样使用std :: cout,我的方式是完美的甚至一些代码也不能包括"qdebug"!
使用时无法将消息输出到控制台 QT += gui.
fprintf(stderr, ...) 也无法打印输出.
请QMessageBox改用显示消息.
这个话题的答案太多了。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();
}
}
Run Code Online (Sandbox Code Playgroud)
我在没有“CONFIG += console”的情况下也尝试过,但是您需要重定向流并自行创建控制台:
#ifdef _WIN32
if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()){
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
freopen("CONIN$", "r", stdin);
}
#endif
Run Code Online (Sandbox Code Playgroud)
但是这仅在您通过调试器启动它时才有效,否则所有输入也都指向系统。意思是,如果您通过 std::cin 键入名称,系统会尝试将该名称作为命令执行。(很奇怪)
对此尝试的另外两个警告是,您不能使用 ::FreeConsole() 它不会关闭它,如果您通过控制台启动它,应用程序将不会关闭。
最后在 QApplication 中有一个Qt 帮助部分关于这个主题。我在那里用一个应用程序尝试了这个例子,但它对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();
}
Run Code Online (Sandbox Code Playgroud)
因此,如果您使用的是 Windows 和 Qt,只需使用控制台选项,如果您需要 GUI,则隐藏控制台并通过退出关闭它。