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;