c++ - print - ¿Cómo llamar a qDebug sin los espacios anexos y la nueva línea?
qdebug print (7)
Combinando algunas de las respuestas anteriores puedes usar
qDebug() << qPrintable(var1);
para eliminar las comillas que rodean.
Estoy usando la función de impresión C ++ / Qt qDebug, pero a veces me gustaría controlar cómo ", space y newline se anexan y no usan el qDebug predeterminado.
Tomemos un ejemplo simple:
QString var1("some string");
int var2 = 1;
qDebug() << var1 << "=" << var2;
Esto se imprimirá
"some string" = 1
Pero digamos que no me gusta el espacio "adjunto" y me gustaría que la impresión se vea como
some string=1
¿Cómo puedo llamar a qDebug?
Nota: Hay una función en qDebug llamada nospace , pero eliminará los espacios. Pero el "todavía está allí".
Si uso esto:
qDebug().nospace() << var1 << "=" << var2;
Yo obtengo:
"some string"=1
Pero tenga en cuenta que todavía no he encontrado una manera de deshacerse de la nueva línea final.
/Gracias
Desde Qt 5.4 también puedes escribir:
qDebug().nospace().noquote() << var1;
El archivo $ (QTDIR) /src/corelib/io/qdebug.h contiene casi todas las definiciones para los métodos de salida de depuración. Uno de ellos es:
QDebug y operador en línea << (const QString & t) {stream-> ts << ''/ "'' << t << ''/"''; return maybeSpace (); }
Por lo tanto, no hay una forma "oficial" de suprimir las comillas, pero por supuesto puede cambiar qdebug.h o usar su propia copia o una copia modificada y renombrada de la clase QDebug.
Otra forma es usar su propio manejador de mensajes .
Espero que esto ayude.
Pruebe este formato: qDebug("%s=%d", "string", 1); En este caso qDebug usa el formato printf
PS Adaptado para su ejemplo: qDebug("%s=%d", var1.toStdString().c_str(), var2);
Sería mejor comprender cómo funciona QDebug internamente. De esta forma, puede modificarlo fácilmente para adaptarlo a sus necesidades. Siempre que use la función qDebug() , devuelve un objeto QDebug . Por defecto QDebug siempre genera un espacio después de cualquier uso del operator << .
La clase QDebug contiene internamente un QString . Cada vez que utiliza el operator << se está agregando a ese QString interno. Esta QString se imprime a través de qt_message_output(QtMsgType, char*) cuando se destruye el objeto QDebug .
Por defecto qt_message_output siempre imprime la cadena seguida de una nueva línea.
Salida normal
qDebug() << "Var" << 1;
Esto generará Var 1 . Esto es porque qDebug creará un objeto QDebug que agrega un espacio después de cada llamada al operator << . Entonces eso será Var + + 1 + .
Sin espacios
Puede usar QDebug::nospace para decirle a QDebug no agregue un espacio después de cada llamada al operator << .
qDebug().nospace() << "Var" << 1;
Esto arrojará Var1 ya que QDebug objeto QDebug ya no imprime espacios.
Sin nuevas líneas
No agregar /n al final de la cadena es un poco más difícil. Dado que QDebug internamente solo pasa la cadena a qt_message_output cuando se destruye, puede retrasar la destrucción de ese objeto QDebug -
QDebug deb = qDebug();
deb << "One" << "Two";
deb << "Three";
Esto imprimirá One Two Three y luego agregará una nueva línea.
Si nunca desea que se imprima una nueva línea, tendrá que cambiar el comportamiento de qt_message_output . Esto se puede hacer instalando un controlador personalizado .
void customHandler(QtMsgType type, const char* msg) {
fprintf(stderr, msg);
fflush(stderr);
}
// Somewhere in your program
qInstallMsgHandler(customHandler);
qDebug() << "One" << "Two";
qDebug().noSpace() << "Three" << "Four";
Esto imprimirá One Two ThreeFour .
Tenga en cuenta que esto afectará a todas las declaraciones qDebug en su programa. Si desea eliminar el controlador personalizado, debe llamar a qInstallMsgHandler(0) .
qDebug (const char * msg, ...)
Como se indica en las otras respuestas, también puede usar la función qDebug para imprimir cadenas en un formato similar al de printf . De esta forma puede evitar los espacios adicionales que QDebug .
Sin embargo, qDebug todavía usa qt_message_output , por lo que aún obtendrá una nueva línea al final a menos que instale su propio controlador.
También experimenté el problema de las citas. La solución es no QString() a la transmisión, sino QString(...).toStdString().c_str() .
Me he creado una pequeña macro de conveniencia para evitar esto fácilmente:
#define Q(string) (string).toStdString().c_str()
Ahora, cada vez que use un QString, hágalo así:
qDebug() << Q(var1) << "=" << var2;