在Qt Gui中使用std :: cout

时间:2014-10-26 20:46:12

标签: c++ linux qt qt-creator cout

我有一个应用程序,当通过终端运行时,用户可以选择命令行模式或GUI模式。

使用std::cout时,似乎没有任何输出到控制台。 std::cout语句不适用于主事件循环。

我已将CONFIG += console添加到我的.pro文件中。

目前,我一直在使用QTextStream(),效果很好:

QTextStream(cout) << "Hello World" << std::endl;

我的问题是:

为什么我不能使用std::cout?这是否与影响输入和输出流的Qt有关?我无法在Qt的文档中找到任何关于此文档的文档。

int main(int argc, char *argv[])
{
    std::cout << argv[1] << std::endl;  //This is being outputted.

    //if(argc == 2 && !strcmp(argv[1],"-win")){
    if(true){ //Just for this example's sake
    QApplication a(argc, argv);

    std::cout << "Hello" << std::endl;   //This is not being ouputted. 
    MainWindow w;
    w.show();
    return a.exec();
    }
    else
    {
        qDebug()  << "Console Mode.\n";
        std::cout << "Console Mode.\n";

        //Do stuff
    }


}

2 个答案:

答案 0 :(得分:2)

这不是Qt问题,而是std::cout如何运作。你好像在这里炸掉你的std::cout

std::cout << argv[1] << std::endl;

即使使用这样的简单程序,您的问题也可以重现:

main.pro

TEMPLATE = app
TARGET = main
CONFIG -= qt
SOURCES += main.cpp

的main.cpp

#include <iostream>

int main(int /*argc*/, char **argv)
{
    std::cout << argv[1] << std::endl;
    std::cout << "Hello stdout!" << std::endl;
    if (std::cout.bad())
        std::cerr << "I/O error while reading\n";
    return 0;
}

构建并运行

Success: qmake && make && ./main foo
Failure: qmake && make && ./main

在您的情况下,argv[1]为零,因此std::cout不再打印任何内容。我建议要么一直传递一个参数和/或使用一些帮助用法打印来检查argc。最好的办法是在最近使用QtCore中的内置命令行解析器。

你可以问为什么?因为它是未定义的行为。您可以阅读documentation

中的详细信息
basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb);
  

构造并检查sentry对象后,检查sb是否为空指针。如果是,则执行setstate(badbit)并退出。

如果您碰巧遇到IDE本身的问题,例如QtCreator,请在QtCreator的情况下执行以下步骤:

Projects -> Select a kit -> Run tab -> Run section -> Arguments

答案 1 :(得分:1)

对我来说工作正常:

QT       += core

QT       -= gui

TARGET = untitled
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

main.cpp中:

#include <QCoreApplication>
#include <QTextStream>

#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    std::cout << "Hello World" << std::endl;

    return a.exec();
}

编辑:

#include <QCoreApplication>
#include <QTextStream>
#include <QtWidgets/QWidget>
#include <QDebug>

#include <iostream>

int main(int argc, char *argv[]) {
    std::cout << "test" << std::endl;  // <--- THE PROBLEM IS HERE...IF YOU TRY A SIMPLE STRING IT WORKS FINE SO THE PROBLEM IS argv[1] IS AN EMPTY STRING

    //if(argc == 2 && !strcmp(argv[1],"-win")){
    if(true){
        //Just for this example's sake
        QCoreApplication a(argc, argv);

        std::cout << "Hello" << std::endl;   //This is not being ouputted.

        return a.exec();
    }
    else
    {
        qDebug()  << "Console Mode.\n";
        std::cout << "Console Mode.\n";

        //Do stuff
    } }