qstringlist print c++ qt qdebug

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.



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;