Comment utiliser QCDebug ?
-
Bonjour,
Habitué à utiliser QDebug() depuis longtemps, j'ai appris l'existance de qCDebug(), et plus largement des Logging Caterories. Mais je n'arrive pas à l'utiliser.
Je continue ma découverte du framework QScxmlStateChart et je suis, grâce aux <log> l'activation des états.
Quand la machine d'états est au point je ne souhaite plus ces messages. Enlever alors les <log> est fastidieux, surtout s'il faut les remettre quand, finalement, la machine d'états n'était pas si au point que ça.
La doc de QScxmlStateMachine précise que cette classe définit 2 logging categories : qscxml et scxml. Je me suis dit alors qu'il est peut-être possible de désactiver la production des <log> en adaptant les règles des 2 catégories.
J'ai donc déjà commencé à essayer d'utilser qCDebug(), pour comprendre.
Dans qscxmlglobals_p.h il y a les deux lignes suivantes :Q_DECLARE_LOGGING_CATEGORY(qscxmlLog) Q_DECLARE_LOGGING_CATEGORY(scxmlLog)
Suivant les exemples trouvés ici et là j'ai tenté dans mon code, juste après les #include :
Q_LOGGING_CATEGORY(qscxmlLog,"qscxmlLog");
... ce que n'aime pas du tout l'éditeur de liens :
/home/sylvain/Developpements/EDS/EDS_sources/Widgets_Perso/graphefrequencearrivees.cpp:7: erreur : multiple definition of `qscxmlLog()'; commandestabs.o:/home/sylvain/Developpements/EDS/build-EDS-Desktop-Debug/../EDS_sources/CommandesTabs/commandestabs.cpp:10: first defined here
Plus loin, puis, dans une méthode
qCDebug(qscxmlLog) << "Changement de pas : " << p;
ne pose en revanche pas de soucis.
Il est évident que je ne pige pas quelque chose mais je n'arrive pas à savoir quoi.
Par avance merci !
Sylvain -
Hi @Max,
to change the log level for existing rules, see https://doc.qt.io/qt-6/qloggingcategory.html#configuring-categories
It is possible to do that from your code (with
setFilterRules()
) or completely outside with environment variables orqtlogging.ini
Regards
-
Bonjour,
L'erreur vient du fait de la re-déclaration que vous faites dans votre fichier.
Ces catégories existent déjà vu que déclarée dansqscxmlglobals_p.h
.
Pour votre code, vous devriez déclarer vos propres catégories afin de les garder indépendantes de celle de Qt et de pouvoir les filtrer à votre convenance. -
Bonjour et merci !
Ce que je ne comprends pas c'est comment utiliser ces Logging Categories puisqu'elles sont référencées dans la doc. : Qt SCXML Overview (bas de page).
Selon cette doc. elles devraient me permettre de faire ce que je souhaite : contrôler les sortie <log> de la QScxmlStateMachine.
-
Hi @Max,
to change the log level for existing rules, see https://doc.qt.io/qt-6/qloggingcategory.html#configuring-categories
It is possible to do that from your code (with
setFilterRules()
) or completely outside with environment variables orqtlogging.ini
Regards
-
Ah, j'ai mal compris le soucis alors.
Comme @aha_1980 l'a pointé. La documentation de QLoggingCategory donne toutes les informations sur comment filtrer les catégories existantes et créer/gérer les siennes.
-
Bonjour, Hi !
Compris, merci ! Thanks!
J'ai défini la variable d'environnement :
export QT_LOGGING_RULES=scxml.statemachine=false
... et plus de <log> issus des changements d'états.
J'ai déduit la clé "scxml.statemachine" des sorties <log> habituelles. --> Existe-t-il d'autres clés ?
Concernant la catégorie "qscxml", quelle est la différence avec la catégorie "scxml".
Regards,
Sylvain -
-
Le premier concerne le module lui-même et le second les documents scxml.
-
Cela signifie que le module utilise cette catégorie pour partager ses messages de log avec qCDebug, qCWarning, etc. L'utilisateur peut donc les filtrer spécifiquement pour aider à debugger en cas de soucis.
Cela concerne le code du module lui-même. Cela permet de séparer les choses entre l'implérmentation du module et la partie qui concernent uniquement les documents scxml.
Plus basiquement, le code peut être tout à fait fonctionnel mais c'est le document qui contient des erreurs.