web-dev-qa-db-fra.com

Comment appeler qDebug sans les espaces ajoutés et la nouvelle ligne?

J'utilise la fonction d'impression C++/Qt qDebug, mais parfois je voudrais contrôler comment ", l'espace et la nouvelle ligne sont ajoutés et ne pas utiliser le qDebug par défaut.

Prenons un exemple simple:

QString var1("some string");
int var2 = 1;
qDebug() << var1 << "=" << var2;

Cela imprimera

"some string" = 1 

Mais disons que je n'aime pas l'espace "et" et je voudrais que l'impression ressemble à

some string=1 

Comment puis-je appeler qDebug?


Remarque: Il existe une fonction dans qDebug appelée nospace , mais elle supprimera les espaces. Mais le "est toujours là.

Si j'utilise ceci:

qDebug().nospace() << var1 << "=" << var2;

Je reçois:

"some string"=1

Mais veuillez noter que je n'ai toujours pas trouvé de moyen de me débarrasser de la nouvelle ligne de fin.

/Merci

55
Johan

Essayez ce format: qDebug("%s=%d", "string", 1); Dans ce cas qDebug utilise printf formatage

P.S. Adapté à votre exemple: qDebug("%s=%d", var1.toStdString().c_str(), var2);

49
Johnny

Il serait préférable de comprendre comment QDebug fonctionne en interne. De cette façon, vous pouvez facilement le modifier selon vos besoins. Chaque fois que vous utilisez la fonction qDebug(), elle retourne un objet QDebug. Par défaut, QDebug génère toujours un espace après toute utilisation de operator <<.

La classe QDebug contient en interne un QString. Chaque fois que vous utilisez operator <<, Vous ajoutez à cette chaîne QS interne. Cette QString est imprimée via qt_message_output(QtMsgType, char*) lorsque l'objet QDebug est détruit.

Par défaut, qt_message_output Imprime toujours la chaîne suivie d'une nouvelle ligne.

Sortie normale

qDebug() << "Var" << 1;

Cela produira Var 1. En effet, qDebug créera un objet QDebug qui ajoutera un espace après chaque appel à operator <<. Ce sera donc Var + + 1 +.

Sans espaces

Vous pouvez utiliser QDebug::nospace Pour dire à QDebug de ne pas ajouter d'espace après chaque appel à operator <<.

qDebug().nospace() << "Var" << 1;

Cela produira Var1 Car cet objet QDebug n'imprimera plus d'espaces.

Sans nouvelles lignes

Ne pas ajouter le \n À la fin de la chaîne est un peu plus difficile. Puisque QDebug en interne ne passe la chaîne à qt_message_output Que lorsqu'elle est détruite, vous pouvez retarder la destruction de cet objet QDebug -

QDebug deb = qDebug();
deb << "One" << "Two";
deb << "Three";

Cela imprimera One Two Three, Puis ajoutera une nouvelle ligne.

Si vous ne souhaitez jamais qu'une nouvelle ligne soit imprimée, vous devrez modifier le comportement de qt_message_output. Cela peut être fait en installant un gestionnaire personnalisé .

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";

Cela imprimera One Two ThreeFour.

Soyez averti que cela affectera toutes les instructions qDebug de votre programme. Si vous souhaitez supprimer le gestionnaire personnalisé, vous devez appeler qInstallMsgHandler(0).

qDebug (const char * msg, ...)

Comme indiqué par les autres réponses, vous pouvez également utiliser la fonction qDebug pour imprimer des chaînes dans un format similaire à celui de printf . De cette façon, vous pouvez éviter les espaces supplémentaires ajoutés par QDebug.

Cependant, qDebug utilise toujours en interne qt_message_output, Donc vous obtiendrez toujours une nouvelle ligne à la fin, sauf si vous installez votre propre gestionnaire.

76
Vishesh Handa

Depuis Qt 5.4, vous pouvez également écrire:

qDebug().nospace().noquote() << var1;
26
user4444617

Combiner certaines des réponses ci-dessus que vous pouvez utiliser

qDebug() << qPrintable(var1);

pour éliminer les guillemets environnants.

20
Tim MB

J'ai également rencontré le problème des devis. La solution consiste à ne pas diriger QString() dans le flux mais à la place QString(...).toStdString().c_str().

Je me suis construit une petite macro pratique pour contourner facilement ceci:

#define Q(string) (string).toStdString().c_str()

Maintenant, chaque fois que vous utilisez un QString, faites-le comme ça:

qDebug() << Q(var1) << "=" << var2;
7
hurikhan77

Le fichier $ (QTDIR) /src/corelib/io/qdebug.h contient presque toutes les définitions des méthodes de sortie de débogage. L'un d'eux est:

inline QDebug & operator << (const QString & t) {stream-> ts << '\ "' << t << '\"'; return MaybeSpace (); }

Il n'y a donc aucun moyen "officiel" de supprimer les guillemets, mais vous pouvez bien sûr changer qdebug.h ou utiliser votre propre copie ou une copie modifiée et renommée de la classe QDebug.

5
hmuelner

Une autre façon est d'utiliser votre propre gestionnaire de messages .
J'espère que cela t'aides.

0
zkunov