summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@woboq.com>2011-12-10 10:58:09 +0100
committerOlivier Goffart (Woboq GmbH) <ogoffart@woboq.com>2015-02-05 14:28:27 +0000
commiteb4f183127cb5c73fe84adc296fbc03fa8d61523 (patch)
tree8710d898e1126f2d6abe07ce89e8bfd3d311836b
parent9b72bcfd608817509d062f0971212cccfbe3d285 (diff)
Add a qDebug operator overload to handle registered enum
So if you stream enum type into qDebug, it will show the name of the enum value instead of the int Change-Id: Iec5e826623353560319890d3e7c4ab97d0645f4a Reviewed-by: Marc Mutz <marc.mutz@kdab.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
-rw-r--r--src/corelib/kernel/qobject.cpp14
-rw-r--r--src/corelib/kernel/qobject.h10
-rw-r--r--tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp9
3 files changed, 32 insertions, 1 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index be6441933f..0a8369acbf 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -4105,6 +4105,20 @@ QDebug operator<<(QDebug dbg, const QObject *o)
dbg << ')';
return dbg;
}
+
+QDebug qt_QMetaEnum_debugOperator(QDebug &dbg, int value, const QMetaObject *meta, const char *name)
+{
+ QDebugStateSaver saver(dbg);
+ QMetaEnum me = meta->enumerator(meta->indexOfEnumerator(name));
+ const char *key = me.valueToKey(value);
+ dbg.nospace() << meta->className() << "::" << name << '(';
+ if (key)
+ dbg << key;
+ else
+ dbg << value;
+ dbg << ')';
+ return dbg;
+}
#endif
/*!
diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h
index 78f913acf8..20ff9981b1 100644
--- a/src/corelib/kernel/qobject.h
+++ b/src/corelib/kernel/qobject.h
@@ -547,6 +547,16 @@ template <class T> inline const char * qobject_interface_iid()
#ifndef QT_NO_DEBUG_STREAM
Q_CORE_EXPORT QDebug operator<<(QDebug, const QObject *);
+Q_CORE_EXPORT QDebug qt_QMetaEnum_debugOperator(QDebug&, int value, const QMetaObject *meta, const char *name);
+
+template<typename T>
+typename QtPrivate::QEnableIf<QtPrivate::IsQEnumHelper<T>::Value , QDebug>::Type
+operator<<(QDebug &dbg, T value)
+{
+ const QMetaObject *obj = qt_getEnumMetaObject(value);
+ const char *name = qt_getEnumName(value);
+ return qt_QMetaEnum_debugOperator(dbg, typename QFlags<T>::Int(value), obj, name);
+}
#endif
class QSignalBlocker
diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
index 7614c52e66..1774782262 100644
--- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
+++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
@@ -225,6 +225,7 @@ private slots:
void signal();
void signalIndex_data();
void signalIndex();
+ void enumDebugStream();
signals:
void value6Changed();
@@ -1206,7 +1207,6 @@ void tst_QMetaObject::metaMethod()
QCOMPARE(str, QString("foo"));
QCOMPARE(ret, QString("bar"));
-
QtTestObject obj;
QString t1("1"); QString t2("2"); QString t3("3"); QString t4("4"); QString t5("5");
QString t6("6"); QString t7("7"); QString t8("8"); QString t9("9"); QString t10("X");
@@ -1412,5 +1412,12 @@ void tst_QMetaObject::signalIndex()
SignalTestHelper::signalIndex(mm));
}
+void tst_QMetaObject::enumDebugStream()
+{
+ QTest::ignoreMessage(QtDebugMsg, "hello MyNamespace::MyClass::MyEnum(MyEnum2) world ");
+ MyNamespace::MyClass::MyEnum e = MyNamespace::MyClass::MyEnum2;
+ qDebug() << "hello" << e << "world";
+}
+
QTEST_MAIN(tst_QMetaObject)
#include "tst_qmetaobject.moc"