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
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);
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.
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 +.
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.
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)
.
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.
Depuis Qt 5.4, vous pouvez également écrire:
qDebug().nospace().noquote() << var1;
Combiner certaines des réponses ci-dessus que vous pouvez utiliser
qDebug() << qPrintable(var1);
pour éliminer les guillemets environnants.
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;
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.
Une autre façon est d'utiliser votre propre gestionnaire de messages .
J'espère que cela t'aides.