diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2016-05-26 09:11:28 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2016-06-09 20:16:47 +0000 |
commit | d2c6294bd5cc3c2e61aaa0c83bfd74941ced150e (patch) | |
tree | a228f4e36e33bebc9d04a8f7f94352948b25f9f3 /tests | |
parent | b05741937c2827c05d2160ccf98f389eb03b6f35 (diff) |
Diaglib: Add class LogWidget.
Add a class to display debug messages, providing convenience functions for
installing and formatting parameters like indentation. It prints a startup
message containing relevant information about Qt.
Change-Id: Id0a19adbb5953a6ded1a8e692f242b63748e7273
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/manual/diaglib/README.txt | 11 | ||||
-rw-r--r-- | tests/manual/diaglib/diaglib.pri | 12 | ||||
-rw-r--r-- | tests/manual/diaglib/logwidget.cpp | 164 | ||||
-rw-r--r-- | tests/manual/diaglib/logwidget.h | 94 |
4 files changed, 277 insertions, 4 deletions
diff --git a/tests/manual/diaglib/README.txt b/tests/manual/diaglib/README.txt index fd199d09cb..ab243da9ae 100644 --- a/tests/manual/diaglib/README.txt +++ b/tests/manual/diaglib/README.txt @@ -32,6 +32,17 @@ class DebugProxyStyle (debugproxystyle.h) the parameters and return values of its function calls, useful for debugging QStyle. +class LogWidget (logwidget.h) + A Log Widget inheriting QPlainTextEdit with convenience functions + to install as a message handler. + +class LogFunctionGuard + A guard class for use with LogWidget logging messages when a function + is entered/left (indenting the log messages). + Can be instantiated using: + LogFunctionGuard guard(__FUNCTION__) or + LogFunctionGuard guard(Q_FUNC_INFO) + function glInfo() (glinfo.h): Returns a string describing the Open GL configuration (obtained by querying GL_VENDOR and GL_RENDERER). Available only diff --git a/tests/manual/diaglib/diaglib.pri b/tests/manual/diaglib/diaglib.pri index a51d2f1201..9bcf0317a6 100644 --- a/tests/manual/diaglib/diaglib.pri +++ b/tests/manual/diaglib/diaglib.pri @@ -23,17 +23,21 @@ greaterThan(QT_MAJOR_VERSION, 4) { QT += gui-private core-private contains(QT, widgets) { HEADERS += \ - $$PWD/qwidgetdump.h + $$PWD/qwidgetdump.h \ + $$PWD/logwidget.h SOURCES += \ - $$PWD/qwidgetdump.cpp + $$PWD/qwidgetdump.cpp \ + $$PWD/logwidget.cpp } } else { HEADERS += \ - $$PWD/qwidgetdump.h + $$PWD/qwidgetdump.h \ + $$PWD/logwidget.h SOURCES += \ - $$PWD/qwidgetdump.cpp + $$PWD/qwidgetdump.cpp \ + $$PWD/logwidget.cpp } contains(QT, opengl) { diff --git a/tests/manual/diaglib/logwidget.cpp b/tests/manual/diaglib/logwidget.cpp new file mode 100644 index 0000000000..5dbefd8da9 --- /dev/null +++ b/tests/manual/diaglib/logwidget.cpp @@ -0,0 +1,164 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "logwidget.h" +#if QT_VERSION >= 0x050000 +# include <QtCore/qlogging.h> +# include <QtCore/QLibraryInfo> +#endif +#include <QApplication> +#include <QStyle> + +#include <QtCore/QDebug> +#include <QtCore/QVector> +#include <QtCore/QStringList> + +#include <iostream> + +LogWidget *LogWidget::m_instance = 0; +bool LogWidget::m_lineNumberingEnabled = true; +bool LogWidget::m_showMessageType = true; +int LogWidget::m_indent = 0; + +LogWidget::LogWidget(QWidget *parent) + : QPlainTextEdit(parent) +{ + LogWidget::m_instance = this; + setReadOnly(true); +} + +LogWidget::~LogWidget() +{ + LogWidget::m_instance = 0; +} + +QString LogWidget::startupMessage() +{ + QString result; +#if QT_VERSION >= 0x050300 + result += QLatin1String(QLibraryInfo::build()); +#else + result += QLatin1String("Qt ") + QLatin1String(QT_VERSION_STR); +#endif + + const QCoreApplication *coreApp = QCoreApplication::instance(); +#if QT_VERSION >= 0x050000 + if (qobject_cast<const QGuiApplication *>(coreApp)) { + result += QLatin1Char(' '); + result += QGuiApplication::platformName(); + } +#endif + if (qobject_cast<const QApplication *>(coreApp)) { + result += QLatin1Char(' '); + result += QApplication::style()->objectName(); + } + if (coreApp) { + QStringList arguments = QCoreApplication::arguments(); + arguments.pop_front(); + if (!arguments.isEmpty()) { + result += QLatin1Char('\n'); + result += arguments.join(QLatin1String(" ")); + } + } + return result; +} + +static const QVector<QString> &messageTypes() +{ + static QVector<QString> result; + if (result.isEmpty()) { + result << QLatin1String("debug") << QLatin1String("warn") + << QLatin1String("critical") << QLatin1String("fatal") + << QLatin1String("info"); + } + return result; +} + +static void messageHandler(QtMsgType type, const QString &text) +{ + static int n = 0; + QString message; + if (LogWidget::lineNumberingEnabled()) + message.append(QString::fromLatin1("%1 ").arg(n, 4, 10, QLatin1Char('0'))); + if (LogWidget::showMessageType()) { + message.append(messageTypes().at(type)); + message.append(QLatin1Char(' ')); + } + for (int i = 0, ie = LogWidget::indent(); i < ie; ++i) + message.append(QLatin1Char(' ')); + message.append(text); + if (LogWidget *logWindow = LogWidget::instance()) + logWindow->appendText(message); +#ifdef Q_OS_WIN + std::wcerr << reinterpret_cast<const wchar_t *>(message.utf16()) << L'\n'; +#else + std::cerr << qPrintable(message) << '\n'; +#endif + n++; +} + +#if QT_VERSION >= 0x050000 + +static void qt5MessageHandler(QtMsgType type, const QMessageLogContext &, const QString &text) +{ messageHandler(type, text); } + +void LogWidget::install() +{ + qInstallMessageHandler(qt5MessageHandler); + qInfo("%s", qPrintable(LogWidget::startupMessage())); +} + +void LogWidget::uninstall() { qInstallMessageHandler(Q_NULLPTR); } + +#else // Qt 5 + +static QtMsgHandler oldHandler = 0; + +static void qt4MessageHandler(QtMsgType type, const char *text) +{ messageHandler(type, QString::fromLocal8Bit(text)); } + +void LogWidget::install() +{ + oldHandler = qInstallMsgHandler(qt4MessageHandler); + qDebug("%s", qPrintable(LogWidget::startupMessage())); +} + +void LogWidget::uninstall() { qInstallMsgHandler(oldHandler); } + +#endif // Qt 4 + +void LogWidget::appendText(const QString &message) +{ + appendPlainText(message); + ensureCursorVisible(); +} diff --git a/tests/manual/diaglib/logwidget.h b/tests/manual/diaglib/logwidget.h new file mode 100644 index 0000000000..1a85cc143d --- /dev/null +++ b/tests/manual/diaglib/logwidget.h @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef LOGWIDGET_H +#define LOGWIDGET_H + +#include <QPlainTextEdit> + +// Instantiate as follows: LogFunctionGuard guard(Q_FUNC_INFO) +class LogFunctionGuard { + Q_DISABLE_COPY(LogFunctionGuard) +public: + explicit LogFunctionGuard(const char *name); + ~LogFunctionGuard(); + +private: + const char *m_name; +}; + +class LogWidget : public QPlainTextEdit +{ + Q_OBJECT +public: + explicit LogWidget(QWidget *parent = 0); + ~LogWidget(); + + static LogWidget *instance() { return m_instance; } + + static QString startupMessage(); + static void install(); + static void uninstall(); + + static int indent() { return m_indent; } + static void setIndent(int i) { m_indent = i; } + + static bool lineNumberingEnabled() { return m_lineNumberingEnabled; } + static void setLineNumberingEnabled(bool l) { m_lineNumberingEnabled = l; } + + static bool showMessageType() { return m_showMessageType; } + static void setShowMessageType(bool s) { m_showMessageType = s; } + +public slots: + void appendText(const QString &); + +private: + static int m_indent; + static bool m_lineNumberingEnabled; + static bool m_showMessageType; + static LogWidget *m_instance; +}; + +inline LogFunctionGuard::LogFunctionGuard(const char *name) : m_name(name) +{ + qDebug(">%s", m_name); + LogWidget::setIndent(LogWidget::indent() + 2); +} + +inline LogFunctionGuard::~LogFunctionGuard() +{ + LogWidget::setIndent(LogWidget::indent() - 2); + qDebug("<%s", m_name); +} + +#endif // LOGWIDGET_H |