Использование std :: cout в Qt Gui

0

У меня есть приложение, которое при запуске через терминал имеет опцию между режимом командной строки или графическим интерфейсом.

Кажется, что нет никакого вывода на консоль при использовании 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 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
    }


}
  • 0
    Можете ли вы показать свой код?
Теги:
qt
cout
qt-creator

2 ответа

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 с некоторой помощью print использования. Лучше всего было бы использовать встроенный синтаксический анализатор командной строки в QtCore в эти дни.

Вы могли бы спросить, почему? Потому что это неопределенное поведение. Вы можете прочитать данные из документации:

basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb);

После создания и проверки объекта часового, проверяет, является ли sb нулевым указателем. Если это так, выполняется setstate (badbit) и завершается.

Если у вас возникла проблема с самой IDE, например QtCreator, выполните следующие шаги в случае QtCreator:

Projects -> Select a kit -> Run tab -> Run section -> Arguments
  • 0
    Я сошел с ума, все время запускал программу из Qt Creator. Я исправил проблему с вашей помощью.
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 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
    } }
  • 0
    Оператор сказал в главном цикле событий, но вы вызываете свою печать перед циклом событий.
  • 0
    Вы приводили аргументы, это не было проблемой Qt ... Я только что видел исходный код обновленной версии вопроса ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню