Another porting question -- QLoggingCategory
Halla Rempt
halla at valdyas.org
Wed Aug 21 13:16:50 BST 2024
Hi,
We had setup logging in Krita as follows:
kis_debug.h:
extern const KRITAGLOBAL_EXPORT QLoggingCategory &_30009();
extern const KRITAGLOBAL_EXPORT QLoggingCategory &_41000();
extern const KRITAGLOBAL_EXPORT QLoggingCategory &_41001();
...
#define dbgResources qCDebug(_30009)
#define dbgKrita qCDebug(_41000)
#define dbgImage qCDebug(_41001)
...
#define infoResources qCInfo(_30009)
#define infoKrita qCInfo(_41000)
#define infoImage qCInfo(_41001)
kis_debug.cpp
Q_LOGGING_CATEGORY(_30009, "krita.lib.resources", QtInfoMsg)
Q_LOGGING_CATEGORY(_41000, "krita.general", QtInfoMsg)
Q_LOGGING_CATEGORY(_41001, "krita.core", QtInfoMsg)
And we'd use this like:
dbgResources << "Skipping saving tag " << tag->name(false) << filename << tag->resourceType();
This works fine with Qt5, but with Q6 we get errors:
n file included from /usr/include/x86_64-linux-gnu/qt6/QtCore/QLoggingCategory:1,
from /home/halla/dev/krita/libs/global/kis_debug.h:10,
from /home/halla/dev/krita/libs/global/kis_algebra_2d.cpp:11:
/usr/include/x86_64-linux-gnu/qt6/QtGui/qvectornd.h: In function ‘constexpr QVector2D operator/(QVector2D, float)’:
/home/halla/dev/krita/libs/global/kis_debug.h:102:18: error: variable ‘qt_category’ of non-literal type ‘{anonymous}::QLoggingCategoryMacroHolder<QtCriticalMsg>’ in ‘constexpr’ function
102 | #define errKrita qCCritical(_41000)
| ^~~~~~~~~~
/usr/include/x86_64-linux-gnu/qt6/QtCore/qloggingcategory.h:60:35: note: ‘{anonymous}::QLoggingCategoryMacroHolder<QtCriticalMsg>’ is not literal because:
60 | template <QtMsgType Which> struct QLoggingCategoryMacroHolder
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
The Qt code changed from
#if !defined(QT_NO_DEBUG_OUTPUT)
# define qCDebug(category, ...) \
for (bool qt_category_enabled = category().isDebugEnabled(); qt_category_enabled; qt_category_enabled = false) \
QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, category().categoryName()).debug(__VA_ARGS__)
#else
# define qCDebug(category, ...) QT_NO_QDEBUG_MACRO()
#endif
in Qt5 to
#define QT_MESSAGE_LOGGER_COMMON(category, level) \
for (QLoggingCategoryMacroHolder<level> qt_category((category)()); qt_category; qt_category.control = false) \
QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, qt_category.name())
#define qCDebug(category, ...) QT_MESSAGE_LOGGER_COMMON(category, QtDebugMsg).debug(__VA_ARGS__)
And I cannot figure out how to avoid that error other than replacing all our defines with literal calls to qCDebug(), which is going to be a huge diff.
Does anyone have any idea?
Halla
#define QT_MESSAGE_LOGGER_COMMON(category, level) \
for (QLoggingCategoryMacroHolder<level> qt_category((category)()); qt_category; qt_category.control = false) \
QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, qt_category.name())
#define qCDebug(category, ...) QT_MESSAGE_LOGGER_COMMON(category, QtDebugMsg).debug(__VA_ARGS__)
More information about the kimageshop
mailing list