2010-07-29 139 views
41

我已经在Windows上运行Qt的GUI应用程序,允许命令行选项来传递,并且在某些情况下,我想输出信息到控制台,然后退出,例如: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(); 
} 

然而,当我从命令提示符运行应用程序时,不会显示控制台消息。有谁知道我可以如何让这个工作?所有的

+0

你在窗户上吗?你确定它没有启动一个控制台,然后立即退出吗?我从来没有真正使用过基本教程以外的Qt,尽管 – Falmarri 2010-07-29 08:19:10

+0

我在Windows上,并且正在从命令行运行应用程序。 – Rob 2010-07-29 08:23:04

+3

这实际上很奇怪 - 我注意到在GUI模式下没有输出到控制台,但是如果从命令行运行程序并将其重定向到文件'myprogram.exe> output.txt',然后输出到此处文件。也许像Windows版本的“猫”这样简单的东西可以轻松解决问题? – 2013-03-23 00:42:49

回答

40

Windows不真正支持双模式应用程序。

要查看控制台输出,你需要创建一个控制台应用程序

CONFIG += console 

但是,如果你在程序双击启动GUI模式版本,那么你将获得出现一个控制台窗口,这可能不是你想要什么。为了防止出现控制台窗口,您必须创建一个GUI模式应用程序,在这种情况下,控制台中不会输出。

一个想法可能是创建第二个小应用程序,它是一个控制台应用程序并提供输出。这可以叫第二个人做这项工作。

或者你可以把所有的功能放在一个DLL中,然后创建两个版本的.exe文件,它们具有非常简单的调用到DLL中的主函数。一个用于GUI,另一个用于控制台。

+0

是的,这是我已经意识到的 - 两个应用程序! – Rob 2010-07-30 09:01:32

+0

有一个小型控制台应用程序来调用主GUI应用程序很好,但有什么方法可以实时将输出反馈到控制台应用程序,以便用户可以看到正在发生的事情,或者显示典型的输出,例如 - 小时, - 版本等? – iforce2d 2013-05-27 07:11:57

+3

您可以通过调用FreeConsole来释放控制台。因此,如果在GUI模式下运行,您的应用程序可能会决定它的工作模式,然后隐藏控制台。 – 2013-06-10 02:57:21

-2

首先,你可以尝试刷新缓冲区

std::cout << "Hello, world!"<<std::endl; 

更多基于Qt的记录,你可以尝试使用qDebug。

+0

qDebug不适用于发布模式构建。 – Rob 2010-07-29 08:22:44

+1

std :: endl没有任何区别。 – Rob 2010-07-29 08:27:34

2

我在下面为我的项目使用了这个标题。希望能帮助到你。 PS:如果将来你可以添加dateString来输出。

+1

使用以__开头的包括警卫正在寻求麻烦... – rubenvb 2010-07-29 09:06:44

+0

这与问题无关......但也许你是对的。 – mosg 2010-07-29 09:51:03

+0

fprintf在我的GUI应用程序中不会产生任何输出。 – neuviemeporte 2010-12-07 18:53:03

0

首先,您为什么需要在发布模式下输出到控制台?没有人会想看看那里的时候有一个GUI ...

其次,qDebug就是看中了:)

第三,你可以尝试添加console.proCONFIG,它可能工作。

+0

此应用程序可以以两种模式运行 - 控制台使用命令行开关和amd作为GUI。 – Rob 2010-07-29 09:18:59

+3

个人的控制台是我要找的第一个地方的错误信息:-) – 2011-10-15 22:35:14

0

在你的.pro添加

CONFIG   += console 
+1

对不起,rubenvb说的重复。 – 2010-07-29 15:50:15

6

使用QT += gui时无法向控制台输出消息。

fprintf(stderr, ...)也无法打印输出。使用QMessageBox代替显示消息。

+0

QMessageBox可以输出到控制台吗? o.0 – 2016-03-16 02:18:48

4

哦,你可以使用QT += guiCONFIG += console输出信息。

你需要printf("foo bar")cout << "foo bar"不工作,你可能要调查,至少窗户

+4

printf,cout或者qDebug都不能在我的配置文件中为控制台打印任何东西。 – Zitrax 2015-07-15 15:01:03

2

的东西,是在Windows API的AllocConsole()函数。它调用GetStdHandle几次来重定向stdout,stderr等等。(一个快速测试显示这并不完全符合我们希望它做的事情。你会得到一个与其他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

(我想补充这是一个评论,但规则阻止我这样做......)

4
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<<"[email protected]@"; 
    qDebug()<<"start!"; 

不能使用std ::法院如其他人所说的,我的方式是完美的,甚至对某些代码不能包括“qdebug”!

+0

它看起来不像你使用pFileCon。或者我误解了freopen的作用? – drescherjm 2014-04-10 17:48:50

+0

Windows用户的窍门。任何跨平台的推荐? – 2016-03-16 02:21:23

+0

优秀的解决方案。我想补充一点,为了获得Qt控制台的行为,你需要扩展代码以包含stderr。 我用它来诊断安装在客户端计算机上的“Release”应用程序。在特定的命令行切换后,我的发布应用程序将打开一个控制台stdout和stderr重新路由到它时,控制台会输出我所有的诊断信息和Qt的错误,就像在你使用.pro文件中的CONFIG + = console时一样。 – 2017-03-24 13:14:33

0

它可能是其他答案的疏忽,也可能是用户确实需要控制台输出的要求,但对我来说,明显的答案是创建一个可显示或隐藏的辅助窗口(带有复选框或按钮),通过将文本行添加到文本框小部件并将其用作控制台来显示所有消息?

这样的解决方案的好处是:

  • 的简单解决方案(提供所有它显示是一个简单的日志)。
  • 将“控制台”小部件停靠在主应用程序窗口上的功能。 (无论如何,在Qt中)。
  • 能够创建许多控制台(如果超过1个线程等)。
  • 从本地控制台输出到发送通过网络登录到客户端的一个非常简单的变化。

希望这给你回味无穷,虽然我以任何方式没有资格来推测你应该怎么做我不,我能想象这是一个小的搜索东西通过我们任何一个人很实现的/读!

0

确保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..."; 
} 
0

我也玩过这个,在发现重定向输出工作,但我从来没有看到输出到控制台窗口,这是目前每一个Windows应用程序。到目前为止,这是我的解决方案,直到找到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(); 
    } 
} 
+0

不适用于我。 Qt-5.6 + CMake – 2016-12-21 09:11:25

-1

具有完全相同的问题相当长期的斗争后,我发现根本

CONFIG += console 

确实的伎俩。直到你明确告诉QtCreator在项目上执行qmake(在项目上右键点击)并更改源文件内的内容然后重新生成,它才会起作用。否则,编译将被跳过,并且您仍然不会在命令行中看到输出。 现在我的程序在GUI和cmd行模式下工作。

6

地址:

#ifdef _WIN32 
if (AttachConsole(ATTACH_PARENT_PROCESS)) { 
    freopen("CONOUT$", "w", stdout); 
    freopen("CONOUT$", "w", stderr); 
} 
#endif 

main()顶部。只有当程序在控制台中启动时,这将启用输出到控制台,并且在其他情况下不会弹出控制台窗口。如果你想,当你运行控制台之外的应用程序创建一个控制台窗口中显示的信息,您可以更改条件:

if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) 
+0

这不适用于重定向(./executable> out.txt) – dvntehn00bz 2017-06-16 19:11:40

+1

我已经花了一些时间看这个,它看起来像你可以使用GetFileType来确定管道是否处于活动状态。在我修改的代码中,我设置了stdout_type = GetFileType(GetStdHandle(STD_OUTPUT_HANDLE));然后,我使用条件打包标准输出的freopen:if(stdout_type == FILE_TYPE_UNKNOWN) 这似乎有效地允许进程输出到现有管道(如果可用),但在管道未打开时输出到父控制台。 – dvntehn00bz 2017-06-16 19:51:58

+0

这是一个简单的修复,在我的情况下在Win7/Qt 5.10中使用QGuiApplication也需要控制台输出。 – 2017-12-23 06:13:06

-1

第一步:创建新的项目。 Go File-> New File or Project - > Other Project - > Empty Project

Step2:使用下面的代码。

在.pro文件

QT +=widgets 
CONFIG += console 
TARGET = minimal 
SOURCES += \ main.cpp 

第三步: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; 
input = in.readLine(); 
out << "The input is " << input << endl; 
return app.exec(); 
} 

我在代码中创建了必要的对象以供您理解。

只要运行它

如果你希望你的程序获得多个输入一些条件。然后通过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 

希望它教育你。

好日子

0

所以很多回答这个话题。 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 

BUT这只有在你通过调试器启动时才有效,否则所有的输入都会直接指向系统。意思是,如果你通过std :: cin键入一个名字,系统会尝试执行命令作为命令。 (非常奇怪)

其他两个警告这个尝试是,你不能使用:: FreeConsole()它不会关闭它,如果你通过控制台启动它,应用程序将不会关闭。



最后还有一个Qt help section in QApplication这个话题。我试过的例子有一个应用程序,它不会为GUI工作,它在一个无限循环的地方stucked和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并通过退出关闭它,请隐藏控制台。

相关问题