Как печатать на консоль при использовании Qt - PullRequest
144 голосов
/ 08 октября 2010

Я использую Qt4 и C ++ для создания некоторых программ в компьютерной графике. Мне нужно иметь возможность печатать некоторые переменные в консоли во время выполнения, не отлаживая, но, похоже, cout не работает, даже если я добавляю библиотеки. Есть ли способ сделать это?

Ответы [ 11 ]

180 голосов
/ 08 октября 2010

Если этого достаточно для печати на stderr, вы можете использовать следующие потоки, изначально предназначенные для отладки:

#include<QDebug>

//qInfo is qt5.5+ only.
qInfo() << "C++ Style Info Message";
qInfo( "C Style Info Message" );

qDebug() << "C++ Style Debug Message";
qDebug( "C Style Debug Message" );

qWarning() << "C++ Style Warning Message";
qWarning( "C Style Warning Message" );

qCritical() << "C++ Style Critical Error Message";
qCritical( "C Style Critical Error Message" );

// qFatal does not have a C++ style method.
qFatal( "C Style Fatal Error Message" );

Хотя, как указано в комментариях, помните, что сообщения qDebug удаляются, если QT_NO_DEBUG_OUTPUT определено

Если вам нужен стандартный вывод, вы можете попробовать что-то вроде этого (как указал Кайл Стрэнд):

QTextStream& qStdOut()
{
    static QTextStream ts( stdout );
    return ts;
}

Затем вы можете позвонить следующим образом:

qStdOut() << "std out!";
144 голосов
/ 15 июля 2013

Я нашел это самое полезное:

#include <QTextStream>

QTextStream out(stdout);
foreach(QString x, strings)
    out << x << endl;
32 голосов
/ 10 марта 2015

Запись в stdout

Если вы хотите что-то, что, например, std::cout, записывает в стандартный вывод вашего приложения, вы можете просто сделать следующие ( кредит для CapelliC ):

QTextStream(stdout) << "string to print" << endl;

Если вы хотите избежать создания временного QTextStream объекта, следуйте предложению Якка в комментариях ниже о создании функции, возвращающей дескриптор static для stdout:

inline QTextStream& qStdout()
{
    static QTextStream r{stdout};
    return r;
}

...

foreach(QString x, strings)
    qStdout() << x << endl;

Запомните до flush потока периодически, чтобы гарантировать, что вывод фактически напечатан.

Запись в stderr

Обратите внимание, что вышеуказанная методика также может использоваться для других выходов. Однако есть более удобочитаемые способы написать в stderr ( кредит Гозу и комментарии под его ответом):

qDebug() << "Debug Message";    // CAN BE REMOVED AT COMPILE TIME!
qWarning() << "Warning Message";
qCritical() << "Critical Error Message";
qFatal("Fatal Error Message");  // WILL KILL THE PROGRAM!

qDebug() закрывается, если QT_NO_DEBUG_OUTPUT включен во время компиляции.

(Гоз отмечает в комментарии, что для неконсольных приложений они могут печатать в поток, отличный от stderr.)


ПРИМЕЧАНИЕ: Все методы печати Qt предполагают, что const char* аргументы представляют собой строки в кодировке ISO-8859-1 с завершающими \0 символами.

30 голосов
/ 08 октября 2010

Добавьте это в ваш файл проекта:

CONFIG += console
17 голосов
/ 08 октября 2010

Какие переменные вы хотите напечатать? Если вы имеете в виду QStrings, их необходимо преобразовать в c-Strings. Попробуйте:

std::cout << myString.toAscii().data();
8 голосов
/ 01 ноября 2013

Перейдите в Properties -> Linker-> System -> SubSystem проекта, а затем установите его на Console(/S).

7 голосов
/ 25 сентября 2013

Синтаксис также похож на prinft, например:

qDebug ("message %d, says: %s",num,str); 

Также очень удобно

3 голосов
/ 14 февраля 2017

Как насчет включения библиотеки iostream и точного указания, что cout является объектом std следующим образом:

#include <iostream>

std::cout << "Hello" << std::endl;
1 голос
/ 15 августа 2016
#include <QTextStream>
...
qDebug()<<"Bla bla bla";
1 голос
/ 28 марта 2014

Если вы печатаете в stderr с помощью библиотеки stdio, вызов fflush(stderr) должен очистить буфер и получить запись в реальном времени.

...