У меня есть приложение, которое при запуске через терминал имеет опцию между режимом командной строки или графическим интерфейсом.
Кажется, что нет никакого вывода на консоль при использовании 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
}
}
Это не вопрос Qt, а как работает std::cout
. Кажется, вы взорвали свой std::cout
здесь:
std::cout << argv[1] << std::endl;
Ваша проблема может быть воспроизведена даже с помощью простой программы:
TEMPLATE = app
TARGET = main
CONFIG -= qt
SOURCES += 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
Работает нормально для меня:
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
} }