Я использую Qt4 и C ++ для создания некоторых программ в компьютерной графике. Мне нужно иметь возможность печатать некоторые переменные в консоли во время выполнения, не отлаживая, но cout
, похоже, не работает, даже если я добавляю библиотеки. Есть ли способ сделать это?
159
error: ‘cout’ was not declared in this scope
; с iostream я получаюerror: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char>&)(& std::cout)), ...
; использование команд в ответе вместо этого работает нормально.QString
).Ответы:
Если это достаточно для печати
stderr
, вы можете использовать следующие потоки, изначально предназначенные для отладки:Хотя, как указано в комментариях, имейте в виду, что сообщения qDebug удаляются, если они
QT_NO_DEBUG_OUTPUT
определеныЕсли вам нужен стандартный вывод, вы можете попробовать что-то вроде этого (как отметил Кайл Стрэнд):
Затем вы можете позвонить следующим образом:
источник
Я нашел это наиболее полезным:
источник
qDebug()
самом деле и т. Д., Это будет намного лучшим ответом (ИМО уже превосходит, так как ОП просит что-то заменитьstd::cout
, но 40-тые избиратели, похоже, не согласны).QTextStream qStdout() { return {stdout}; }
может быть полезным способом обернуть это, в соответствии сqWarning()
т. д. А может быть, какое-тоstatic
состояние, чтобы избежать временного распада?Запись в
stdout
Если вы хотите что-то, что, например
std::cout
, записывает в стандартный вывод вашего приложения, вы можете просто сделать следующее ( кредит CapelliC ):Если вы хотите избежать создания временного
QTextStream
объекта, следуйте предложению Якка в комментариях ниже о создании функции, для которой будет возвращатьсяstatic
дескрипторstdout
:Помните , чтобы
flush
поток периодически , чтобы обеспечить выход на самом деле печатается.Запись в
stderr
Обратите внимание, что вышеуказанный метод также может быть использован для других выходов. Тем не менее, есть более читабельные способы написать
stderr
( кредит Гозу и комментарии ниже его ответа):qDebug()
закрывается, еслиQT_NO_DEBUG_OUTPUT
включено во время компиляции.(Гоз отмечает в комментарии, что для неконсольных приложений они могут печатать в другом потоке, чем
stderr
.)ПРИМЕЧАНИЕ. Все методы печати Qt предполагают, что
const char*
аргументами являются строки в кодировке ISO-8859-1 с завершающими\0
символами.источник
QTextStream qStdout() { static QTextStream r{stdout}; return r; }
?template <typename C> constexpr typename std::remove_const<typename std::remove_reference<C>::type>::type& no_const(C* c) { return const_cast<typename std::remove_const<typename std::remove_reference<C>::type>::type&>(*c); }
Использование:no_const(this).method()
. Вы можете внедрить эту функцию как метод в класс, и тогда вам даже не нужно будет передаватьthis
:Foo& no_const() const { return ::no_const(this); }
никаких опечаток, обещаю.QTextStream
объектами. Ред.Добавьте это в ваш файл проекта:
источник
qmake
.Какие переменные вы хотите напечатать? Если вы имеете в виду QStrings, их необходимо преобразовать в c-Strings. Пытаться:
источник
#include <iostream>
myString.toUtf8().data()
лучше, потому что он печатает символы вне диапазона ASCII. Например, китайские иероглифыОн также имеет синтаксис, похожий на prinft, например:
Также очень удобно
источник
Перейдите в проект
Properties -> Linker-> System -> SubSystem
, а затем установите егоConsole(/S)
.источник
Как насчет включения библиотеки iostream и точного определения того, что cout является объектом std следующим образом:
источник
Если вы печатаете в stderr с помощью библиотеки stdio, вызов
fflush(stderr)
должен очистить буфер и получить запись в реальном времени.источник
источник
Итак, после изучения нескольких примеров в Интернете, описывающих, как выводить сообщения из GUI в Qt в stdout, я усовершенствовал рабочий автономный пример перенаправления сообщений на консоль через qDebug () и установки qInstallMessageHandler (). Консоль будет отображаться одновременно с графическим интерфейсом и может быть скрыта при необходимости. Код легко интегрируется с существующим кодом в вашем проекте. Вот полный пример, и вы можете использовать его любым удобным вам способом, если вы придерживаетесь лицензии GNU GPL v2. Вы должны использовать какую-то форму и MainWindow, я думаю - в противном случае образец будет работать, но, вероятно, произойдет сбой при выходе из программы. Примечание: нет способа выйти с помощью кнопки закрытия или закрытия меню, потому что я проверил эти альтернативы, и приложение время от времени будет аварийно завершать работу. Без кнопки закрытия приложение будет стабильным, и вы можете закрыть его из главного окна. Наслаждайтесь!
источник
"build & run"> По умолчанию для "Запуск в терминале" -> Включить
для очистки буфера используйте эту команду -> fflush (stdout); Вы также можете использовать "\ n" в
printf
илиcout
.источник