¿Salida de consola en una aplicación Qt GUI?

Tengo una aplicación Qt GUI ejecutándose en Windows que permite que se pasen las opciones de la línea de comandos y, en algunas circunstancias, deseo enviar un mensaje a la consola y luego salir, por ejemplo:

int main(int argc, char *argv[]) { QApplication a(argc, argv); if (someCommandLineParam) { std::cout << "Hello, world!"; return 0; } MainWindow w; w.show(); return a.exec(); } 

Sin embargo, los mensajes de la consola no aparecen cuando ejecuto la aplicación desde un símbolo del sistema. ¿Alguien sabe cómo puedo hacer que esto funcione?

Windows realmente no es compatible con las aplicaciones de modo dual.

Para ver la salida de la consola, debe crear una aplicación de consola

 CONFIG += console 

Sin embargo, si hace doble clic en el progtwig para iniciar la versión del modo GUI, aparecerá una ventana de consola, que probablemente no sea la que desea. Para evitar que aparezca la ventana de la consola, debe crear una aplicación de modo GUI, en cuyo caso no obtendrá ningún resultado en la consola.

Una idea puede ser crear una segunda aplicación pequeña que sea una aplicación de consola y proporcione la salida. Esto puede llamar al segundo para hacer el trabajo.

O puede poner toda la funcionalidad en una DLL y luego crear dos versiones del archivo .exe que tienen funciones principales muy simples que llaman a la DLL. Uno es para la GUI y el otro es para la consola.

Añadir:

 #ifdef _WIN32 if (AttachConsole(ATTACH_PARENT_PROCESS)) { freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); } #endif 

en la parte superior de main() . Esto habilitará la salida a la consola solo si el progtwig se inicia en una consola y no mostrará una ventana de consola en otras situaciones. Si desea crear una ventana de consola para mostrar mensajes cuando ejecuta la aplicación fuera de una consola, puede cambiar la condición a:

 if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) 

No hay forma de enviar un mensaje a la consola cuando se usa QT += gui .

fprintf(stderr, ...) tampoco puede imprimir la salida.

Use QMessageBox para mostrar el mensaje.

Oh, puedes emitir un mensaje cuando usas QT += gui y CONFIG += console .

Necesitas printf("foo bar") pero cout << "foo bar" no funciona

 void Console() { AllocConsole(); FILE *pFileCon = NULL; pFileCon = freopen("CONOUT$", "w", stdout); COORD coordInfo; coordInfo.X = 130; coordInfo.Y = 9000; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coordInfo); SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE),ENABLE_QUICK_EDIT_MODE| ENABLE_EXTENDED_FLAGS); } int main(int argc, char *argv[]) { Console(); std::cout<<"start@@"; qDebug()<<"start!"; 

No se puede usar std :: cout como otros han dicho, mi camino es perfecto, incluso para algunos códigos no puede incluir "qdebug"!

Utilicé este encabezado a continuación para mis proyectos. Espero eso ayude.

 #ifndef __DEBUG__H #define __DEBUG__H #include  static void myMessageOutput(bool debug, QtMsgType type, const QString & msg) { if (!debug) return; QDateTime dateTime = QDateTime::currentDateTime(); QString dateString = dateTime.toString("yyyy.MM.dd hh:mm:ss:zzz"); switch (type) { case QtDebugMsg: fprintf(stderr, "Debug: %s\n", msg.toAscii().data()); break; case QtWarningMsg: fprintf(stderr, "Warning: %s\n", msg.toAscii().data()); break; case QtCriticalMsg: fprintf(stderr, "Critical: %s\n", msg.toAscii().data()); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s\n", msg.toAscii().data()); abort(); } } #endif 

PD: puedes agregar dateString a la salida si quieres en el futuro.

Algo que puede querer investigar, al menos para Windows, es la función AllocConsole () en la API de Windows. Llama a GetStdHandle varias veces para redirigir stdout, stderr, etc. (Una prueba rápida muestra que esto no hace exactamente lo que queremos que haga. Usted obtiene una ventana de consola abierta junto con sus otras cosas de Qt, pero no puede Como es de suponer, debido a que la ventana de la consola está abierta, hay alguna forma de acceder a ella, obtener un control o acceder a ella y manipularla de alguna manera. Aquí está la documentación de MSDN para aquellos interesados ​​en descubrir esto:

AllocConsole (): http://msdn.microsoft.com/en-us/library/windows/desktop/ms681944%28v=vs.85%29.aspx

GetStdHandle (…): http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231%28v=vs.85%29.aspx

(Agregaría esto como un comentario, pero las reglas me impiden hacerlo …)

Antes que nada, ¿por qué tendrías que enviar a la consola en una versión en modo de lanzamiento? Nadie pensará mirar allí cuando haya una guía …

En segundo lugar, qDebug es elegante 🙂

En tercer lugar, puede intentar agregar console a su CONFIG .pro , podría funcionar.

En tu .pro agrega

 CONFIG += console 

Puede haber sido un descuido de otras respuestas, o tal vez es un requisito del usuario que realmente necesite la salida de la consola, pero la respuesta obvia para mí es crear una ventana secundaria que se puede mostrar u ocultar (con una checkbox o un botón) que muestra todos los mensajes al agregar líneas de texto a un widget de cuadro de texto y usar eso como una consola?

Los beneficios de tal solución son:

  • Una solución simple (que proporciona todo lo que muestra es un registro simple).
  • La capacidad de acoplar el widget ‘consola’ en la ventana principal de la aplicación. (En Qt, de todos modos).
  • La capacidad de crear muchas consolas (si hay más de 1 hilo, etc.).
  • Un cambio bastante fácil desde la salida de la consola local hasta el envío del registro a través de la red a un cliente.

Espero que esto te haga reflexionar, aunque de ninguna manera estoy calificado para postular sobre cómo debes hacerlo, ¡me imagino que es algo muy alcanzable para cualquiera de nosotros con un poco de búsqueda / lectura!

Asegúrese de que Qt5Core.dll se encuentre en el mismo directorio que el ejecutable de su aplicación.

Tuve un problema similar en Qt5 con una aplicación de consola: si inicio la aplicación desde Qt Creator, el texto de salida es visible, si abro cmd.exe y comienzo la misma aplicación allí, no hay salida visible. ¡Muy extraño!

Lo resolví copiando Qt5Core.dll al directorio con el ejecutable de la aplicación.

Aquí está mi pequeña aplicación de consola:

 #include  #include  int main(int argc, char *argv[]) { int x=343; QString str("Hello World"); qDebug()<< str << x<<"lalalaa"; QTextStream out(stdout); out << "aldfjals alsdfajs..."; }