I. Catégories des messages▲
Jetons un coup d'œil à un exemple. Considérons que vous travaillez sur un nouveau jeu totalement révolutionnaire nommé « FlappyCat », qui propose de sauvegarder les meilleurs scores :
bool
Highscore::
load(const
QString
&
filepath)
{
QLoggingCategory fcIo("
fc.io
"
);
qCDebug(fcIo) <
<
"
Chargement
des
meilleurs
scores…
"
;
QFile
file(filepath);
if
(!
file.open(QIODevice
::
ReadOnly |
QIODevice
::
Text)) {
qCWarning(fcIo) <
<
"
Impossible
d'ouvrir
le
fichier
"
<
<
filepath <
<
"
!
"
;
return
;
}
//
...
}
Ce code affiche :
fc.io: Chargement des meilleurs scores…
fc.io: Impossible d'ouvrir le fichier "highscore.xml" !
Que se passe-t-il ici ?
- QLoggingCategory représente une catégorie dans le code (dans ce cas, fc.io). Il ne s'agit pas forcément d'une bijection : plusieurs instances de cette classe peuvent représenter une seule et même catégorie.
- qCDebug, qCWarning et qCCritical vous permettent d'afficher les messages dans des catégories spécifiques. Ils vérifient aussi que la catégorie a bien été activée avant d'assembler le message afin de s'assurer que l'ajout de messages est peu coûteux en ressources (c'est la raison pour laquelle il n'est pas possible de se contenter de redéfinir qDebug() et consorts).
- QtMessageHandler affiche par défaut le nom de la catégorie au début du message.
De façon alternative, vous pouvez aussi définir toutes les catégories au même endroit. Ci-dessous le fichier d'en-tête, puis celui d'implémentation :
#
include
<
QLoggingCategory>
Q_DECLARE_LOGGING_CATEGORY(fcIo)
Q_DECLARE_LOGGING_CATEGORY(fcRender)
Q_DECLARE_LOGGING_CATEGORY(fcLogic)
#
include
"
fclogging.h
"
Q_LOGGING_CATEGORY(fcIo, "
fc.io
"
)
Q_LOGGING_CATEGORY(fcRender, "
fc.render
"
)
Q_LOGGING_CATEGORY(fcLogic, "
fc.logic
"
)
Les macros Q_DECLARE_LOGGING_CATEGORY et Q_LOGGING_CATEGORY permettent de facilement définir des catégories globales.
II. Règles pour les messages de sortie▲
Voyons maintenant comment peaufiner les catégories afin d'activer ou de désactiver les niveaux individuellement.
int
main(int
argc, char
*
*
argv)
{
QGuiApplication app(argc, argv);
QLoggingCategory::
setFilterRules("
*.debug=false\n
"
"
fc.io.debug=true
"
);
//
...
}
Les règles pour les messages de sortie sont écrites au format texte et sont appliquées en appelant setFilterRules(). Dans ce cas, la première règle désactive la sortie de QtDebugMsg, et ce, pour toutes les catégories, tandis que la seconde écrase la précédente en ce qui concerne la catégorie « fc.io ».
III. Fichier de configuration des messages de débogage (à partir de Qt 5.3)▲
Quoi qu'il en soit, il n'est pas pratique de devoir recompiler son application uniquement pour modifier les messages de sortie. C'est pourquoi Qt 5.3 vous permet de passer par un fichier de configuration.
[
rules
]
*.debug=false
fc.io.debug=true
Le fichier de configuration est recherché à différents endroits, selon la plate-forme. Une autre nouveauté sympathique de Qt 5.3 est la possibilité d'utiliser les catégories à la manière de printf :
qCDebug(fcIo, "
Loading
highscore
...
"
);
Vous êtes encouragé à lire la documentation de Qt 5.3, dès qu'elle sera disponible.
IV. Remerciements▲
Au nom de toute l'équipe Qt, j'aimerais adresser le plus grand remerciement à KDAB pour nous avoir autorisés à traduire cet article !
Je tiens à remercier Alexandre Laurent pour ses conseils ainsi que Jacques Théry pour sa relecture.