Qt GUI应用程序中的控制台输出?

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,一个用于控制台.

  • 您可以通过调用FreeConsole释放控制台.因此,您的应用程序可以决定它将以哪种模式工作,然后在GUI模式下运行时隐藏控制台. (3认同)

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)

  • IMO 这应该是公认的答案,因为它完全符合问题中的要求。它还适用于在“add_executable”中使用“WIN32”的基于 CMake 的 Qt 项目。 (3认同)

Gan*_*ank 6

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"!


rai*_*san 5

使用时无法将消息输出到控制台 QT += gui.

fprintf(stderr, ...) 也无法打印输出.

QMessageBox改用显示消息.

  • QMessageBox可以输出到控制台吗?0.0 (2认同)

Pix*_*tar 5

这个话题的答案太多了。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,则隐藏控制台并通过退出关闭它。