Estoy usando Qt4 y C ++ para hacer algunos programas en gráficos de computadora. Necesito poder imprimir algunas variables en mi consola en tiempo de ejecución, sin depurar, pero cout
parece que no funciona incluso si agrego las bibliotecas. ¿Hay alguna forma de hacer esto?
159
error: ‘cout’ was not declared in this scope
; con iostream, me saleerror: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char>&)(& std::cout)), ...
; usar los comandos en la respuesta en su lugar funciona bien.QString
).Respuestas:
Si es lo suficientemente bueno para imprimir
stderr
, puede usar las siguientes secuencias originalmente destinadas a la depuración:Aunque como se señaló en los comentarios, tenga en cuenta que los mensajes qDebug se eliminan si
QT_NO_DEBUG_OUTPUT
se defineSi necesita stdout, puede intentar algo como esto (como ha señalado Kyle Strand):
Entonces puede llamar de la siguiente manera:
fuente
Encontré esto más útil:
fuente
qDebug()
realmente hace, esta será, con mucho, la respuesta superior (La OMI ya es superior ya que OP está pidiendo algo para reemplazarstd::cout
, pero los votantes de 40 parecen no estar de acuerdo)QTextStream qStdout() { return {stdout}; }
podría ser una forma útil de envolver esto, coherente conqWarning()
etc. ¿Y quizás algúnstatic
estado para evitar el daño temporal?Escribiendo a
stdout
Si desea algo que, como
std::cout
, escribe en la salida estándar de su aplicación, simplemente puede hacer lo siguiente ( crédito a CapelliC ):Si desea evitar crear un
QTextStream
objeto temporal , siga la sugerencia de Yakk en los comentarios a continuación de crear una función para devolver unstatic
identificador parastdout
:Recuerde realizar
flush
la transmisión periódicamente para asegurarse de que la salida se imprima realmente.Escribiendo a
stderr
Tenga en cuenta que la técnica anterior también se puede utilizar para otras salidas. Sin embargo, hay formas más legibles de escribir
stderr
( crédito a Goz y los comentarios debajo de su respuesta):qDebug()
está cerrado siQT_NO_DEBUG_OUTPUT
está activado en tiempo de compilación.(Goz señala en un comentario que para las aplicaciones que no son de consola, estas pueden imprimirse en una secuencia diferente a
stderr
).NOTA: Todos los métodos de impresión Qt suponen que los
const char*
argumentos son cadenas codificadas ISO-8859-1 con\0
caracteres de terminación .fuente
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); }
Uso:no_const(this).method()
. Podrías inyectar esa función como método en la clase, y luego ni siquiera necesitarías aprobarthis
:Foo& no_const() const { return ::no_const(this); }
No hay errores tipográficos, lo prometo.QTextStream
objetos temporales . EditadoAgregue esto a su archivo de proyecto:
fuente
qmake
.¿Qué variables quieres imprimir? Si te refieres a QStrings, esos deben convertirse a c-Strings. Tratar:
fuente
#include <iostream>
myString.toUtf8().data()
es mejor porque imprime caracteres fuera del rango ASCII. Caracteres chinos, por ejemploTambién tiene una sintaxis similar a prinft, por ejemplo:
Muy práctico también
fuente
Vaya al Proyecto
Properties -> Linker-> System -> SubSystem
, luego configúreloConsole(/S)
.fuente
¿Qué hay de incluir la biblioteca iostream y precisar que cout es un objeto de std como este:
fuente
Si está imprimiendo en stderr usando la biblioteca stdio, una llamada a
fflush(stderr)
debería vaciar el búfer y obtener un registro en tiempo real.fuente
fuente
Bueno, después de estudiar varios ejemplos en Internet que describen cómo enviar mensajes desde una GUI en Qt a stdout, he refinado un ejemplo independiente de trabajo para redirigir mensajes a una consola, a través de qDebug () e instalar qInstallMessageHandler (). La consola se mostrará al mismo tiempo que la GUI y se puede ocultar si se considera necesario. El código es fácil de integrar con el código existente en su proyecto. Aquí está la muestra completa y siéntase libre de usarla de la forma que desee, siempre y cuando se adhiera a la Licencia GNU GPL v2. Tiene que usar una forma de algún tipo y una ventana principal, creo; de lo contrario, la muestra se ejecutará, pero probablemente se bloqueará cuando se vea obligado a salir. Nota: no hay forma de salir mediante un botón de cierre o un menú de cierre porque he probado esas alternativas y la aplicación se bloqueará eventualmente de vez en cuando. Sin el botón de cerrar, la aplicación será estable y puede cerrarla desde la ventana principal. ¡Disfrutar!
fuente
"build & run"> Predeterminado para "Ejecutar en terminal" -> Habilitar
para vaciar el búfer use este comando -> fflush (stdout); también puedes usar "\ n" en
printf
ocout
.fuente