QDebug: Improve QDebug stream operator for QFlags

Use the built-in hex, showbase manipulator to format the number in
hex. Also, apply nospace() only once.

Change-Id: Id4b3d5f082ad13f52c8711408d7ec609bec3a621
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
This commit is contained in:
Kai Koehne 2014-06-20 15:35:34 +02:00
parent b795e8d7c2
commit 5b0be0c217
2 changed files with 29 additions and 6 deletions

View File

@ -259,21 +259,21 @@ inline QDebug operator<<(QDebug debug, const QContiguousCache<T> &cache)
template <class T>
inline QDebug operator<<(QDebug debug, const QFlags<T> &flags)
{
const bool oldSetting = debug.autoInsertSpaces();
debug.nospace() << "QFlags(";
QDebugStateSaver saver(debug);
debug.resetFormat();
debug.nospace() << "QFlags(" << hex << showbase;
bool needSeparator = false;
for (uint i = 0; i < sizeof(T) * 8; ++i) {
if (flags.testFlag(T(1 << i))) {
if (needSeparator)
debug.nospace() << '|';
debug << '|';
else
needSeparator = true;
debug.nospace() << "0x" << QByteArray::number(typename QFlags<T>::Int(1) << i, 16).constData();
debug << (typename QFlags<T>::Int(1) << i);
}
}
debug << ')';
debug.setAutoInsertSpaces(oldSetting);
return debug.maybeSpace();
return debug;
}
QT_END_NAMESPACE

View File

@ -63,6 +63,7 @@ private slots:
void qDebugQStringRef() const;
void qDebugQLatin1String() const;
void qDebugQByteArray() const;
void qDebugQFlags() const;
void textStreamModifiers() const;
void resetFormat() const;
void defaultMessagehandler() const;
@ -395,6 +396,28 @@ void tst_QDebug::qDebugQByteArray() const
QCOMPARE(QString::fromLatin1(s_function), function);
}
enum TestEnum {
Flag1 = 0x1,
Flag2 = 0x10
};
Q_DECLARE_FLAGS(TestFlags, TestEnum)
void tst_QDebug::qDebugQFlags() const
{
QFlags<TestEnum> flags(Flag1 | Flag2);
MessageHandlerSetter mhs(myMessageHandler);
{ qDebug() << flags; }
QString file = __FILE__; int line = __LINE__ - 1; QString function = Q_FUNC_INFO;
QCOMPARE(s_msgType, QtDebugMsg);
QCOMPARE(s_msg, QString::fromLatin1("QFlags(0x1|0x10)"));
QCOMPARE(QString::fromLatin1(s_file), file);
QCOMPARE(s_line, line);
QCOMPARE(QString::fromLatin1(s_function), function);
}
void tst_QDebug::textStreamModifiers() const
{
MessageHandlerSetter mhs(myMessageHandler);