控制台输出在Qt GUI应用程序?
我有一个在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(); }
但是,从命令提示符运行应用程序时,控制台消息不会显示。 有谁知道我怎么能得到这个工作?
Windows并不真正支持双模式应用程序。
要查看控制台输出,您需要创build一个控制台应用程序
CONFIG += console
但是,如果你双击程序来启动GUI模式版本,那么你会得到一个控制台窗口出现,这可能不是你想要的。 为了防止出现控制台窗口,您必须创build一个GUI模式应用程序,在这种情况下,您不能在控制台中输出。
一个想法可能是创build第二个小应用程序,它是一个控制台应用程序并提供输出。 这可以叫第二个做这个工作。
或者你可以把所有的function放在一个DLL中,然后创build两个版本的.exe文件,它们具有非常简单的调用DLL的主要function。 一个用于GUI,另一个用于控制台。
使用QT += gui
时无法将消息输出到控制台。
fprintf(stderr, ...)
也不能打印输出。
使用QMessageBox
来显示消息。
哦,你可以输出一个消息,当使用QT += gui
和CONFIG += console
。
你需要printf("foo bar")
但是cout << "foo bar"
不起作用
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!";
你不能像其他人所说的那样使用std :: cout,我的方法是完美的,即使对于某些代码也不能包含“qdebug”!
加:
#ifdef _WIN32 if (AttachConsole(ATTACH_PARENT_PROCESS)) { freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); } #endif
在main()
的顶部。 只有当程序在控制台中启动时,这将启用输出到控制台,在其他情况下不会popup控制台窗口。 如果要在控制台外部运行应用程序时创build控制台窗口来显示消息,则可以将条件更改为:
if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())
我使用下面的这个标题为我的项目。 希望它有帮助。
#ifndef __DEBUG__H #define __DEBUG__H #include <QtGui> static void myMessageOutput(bool debug, QtMsgType type, const QString & msg) { if (!debug) return; QDateTime dateTime = QDateTime::currentDateTime(); QString dateString = dateTime.toString("yyyy.MM.dd hh:mm:ss:zzz"); switch (type) { case QtDebugMsg: fprintf(stderr, "Debug: %s\n", msg.toAscii().data()); break; case QtWarningMsg: fprintf(stderr, "Warning: %s\n", msg.toAscii().data()); break; case QtCriticalMsg: fprintf(stderr, "Critical: %s\n", msg.toAscii().data()); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s\n", msg.toAscii().data()); abort(); } } #endif
PS:你可以添加dateString
输出,如果你想在将来。
你可能想要调查的东西,至less在Windows中,是Windows API中的AllocConsole()函数。 它调用GetStdHandle几次来redirectstdout,stderr等(一个快速testing显示这并不完全按照我们想要的方式做,你会得到一个与其他Qt东西一起打开的控制台窗口,但是不能输出到它可能,因为控制台窗口是打开的,有一些方法来访问它,得到一个句柄,或以某种方式访问和操作它。这是MSDN文档,有兴趣了解这一点:
AllocConsole(): http : //msdn.microsoft.com/en-us/library/windows/desktop/ms681944%28v=vs.85%29.aspx
GetStdHandle(…): http : //msdn.microsoft.com/en-us/library/windows/desktop/ms683231%28v=vs.85%29.aspx
(我会添加这个作为评论,但规则阻止我这样做…)
首先,为什么你需要在发布模式下输出到控制台? 没有人会考虑看看那里有一个gui …
其次,qDebug很花哨:)
第三,你可以尝试添加console
到你的.pro
的CONFIG
,它可能工作。
在你的.pro添加
CONFIG += console
这可能是对其他答案的疏忽,也可能是用户确实需要控制台输出的要求,但对我来说,明显的答案是创build一个可显示或隐藏的辅助窗口(使用checkbox或button)通过将文本行添加到文本框小部件并将其用作控制台来显示所有消息?
这种解决scheme的好处是:
- 一个简单的解决scheme(提供所有它显示的是一个简单的日志)。
- 将“控制台”小部件对接到主应用程序窗口的function。 (无论如何,在Qt中)。
- 能够创build许多控制台(如果超过1个线程等)。
- 从本地控制台输出到发送loginnetworking到客户端的一个非常简单的变化。
希望这能给你一点思考,虽然我还没有资格假设你应该怎么做,我可以想象这是我们任何一个人通过一点search/阅读都可以实现的东西!
确保Qt5Core.dll与您的应用程序可执行文件在同一目录中。
我在Qt5中有一个与控制台应用程序类似的问题:如果我从Qt Creator启动应用程序,输出文本是可见的,如果我打开cmd.exe并在那里启动相同的应用程序,则不会显示输出。 很奇怪!
我通过将Qt5Core.dll复制到具有应用程序可执行文件的目录来解决这个问题。
这是我的小控制台应用程序:
#include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) { int x=343; QString str("Hello World"); qDebug()<< str << x<<"lalalaa"; QTextStream out(stdout); out << "aldfjals alsdfajs..."; }
我也玩了这个,发现redirect输出工作,但我从来没有看到输出到控制台窗口,这是每个窗口应用程序目前。 到目前为止,这是我的解决scheme,直到find替代ShowWindow和GetConsoleWindow的Qt。
从没有参数的命令提示符运行这个 – 获取窗口。 从命令提示符运行参数(例如,cmd aaa bbb ccc) – 您可以在命令提示符窗口中获得文本输出 – 就像您对任何Windows控制台应用程序所期望的一样。
请原谅这个蹩脚的例子 – 它代表大约30分钟的修补。
#include "mainwindow.h" #include <QTextStream> #include <QCoreApplication> #include <QApplication> #include <QWidget> #include <windows.h> QT_USE_NAMESPACE int main(int argc, char *argv[]) { if (argc > 1) { // User has specified command-line arguments QCoreApplication a(argc, argv); QTextStream out(stdout); int i; ShowWindow (GetConsoleWindow(),SW_NORMAL); for (i=1; i<argc; i++) out << i << ':' << argv [i] << endl; out << endl << "Hello, World" << endl; out << "Application Directory Path:" << a.applicationDirPath() << endl; out << "Application File Path:" << a.applicationFilePath() << endl; MessageBox (0,(LPCWSTR)"Continue?",(LPCWSTR)"Silly Question",MB_YESNO); return 0; } else { QApplication a(argc, argv); MainWindow w; w.setWindowTitle("Simple example"); w.show(); return a.exec(); } }
经过一个相当长时间的斗争,完全一样的问题,我发现,简单
CONFIG += console
真的有诀窍。 直到你明确地告诉QtCreator在项目上执行qmake(右键单击项目),然后改变源文件内的内容,然后重新编译,它将不起作用。 否则,编译将被跳过,您仍然不会在命令行中看到输出。 现在我的程序在GUI和cmd行模式下工作。
简单
第一步:创build新项目。 去文件 – >新build文件或项目 – >其他项目 – >空项目
第二步:使用下面的代码。
在.pro文件中
QT +=widgets CONFIG += console TARGET = minimal SOURCES += \ main.cpp
第三步: 创buildmain.cpp并复制下面的代码。
#include <QApplication> #include <QtCore> using namespace std; QTextStream in(stdin); QTextStream out(stdout); int main(int argc, char *argv[]){ QApplication app(argc,argv); qDebug() << "Please enter some text over here: " << endl; out.flush(); QString input; input = in.readLine(); out << "The input is " << input << endl; return app.exec(); }
为了您的理解,我在代码中创build了必要的对象。
只是运行它
如果您希望程序在某些情况下获得多个input。 然后在Main.cpp中通过下面的代码
#include <QApplication> #include <QtCore> using namespace std; QTextStream in(stdin); QTextStream out(stdout); int main(int argc, char *argv[]){ QApplication app(argc,argv); qDebug() << "Please enter some text over here: " << endl; out.flush(); QString input; do{ input = in.readLine(); if(input.size()==6){ out << "The input is " << input << endl; } else { qDebug("Not the exact input man"); } }while(!input.size()==0); qDebug(" WE ARE AT THE END"); // endif return app.exec(); } // end main
希望它教育你。
美好的一天,
首先你可以尝试冲洗缓冲区
std::cout << "Hello, world!"<<std::endl;
对于更多的基于Qt的日志logging,你可以尝试使用qDebug。
- 为什么我的文件path中出现Unicode转义的SyntaxError?
- Python在64位窗口上的32位内存限制
- 如何编写Windows批处理脚本以从目录中复制最新的文件?
- 如何使用PowerShell在IIS中停止和启动单个网站?
- Windows命令解释器(CMD.EXE)如何parsing脚本?
- gulp命令未find – 安装gulp后出错
- 在Windows上__cdecl或__stdcall?
- 找不到模块'../build/Release/bson'] code:'MODULE_NOT_FOUND'} js-bson:无法加载c ++ bson扩展,使用纯JS版本
- Windows cmd编码更改导致Python崩溃