diff options
author | Liang Qi <liang.qi@qt.io> | 2016-06-13 09:01:02 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-06-13 12:46:46 +0200 |
commit | 511790fd1af1e2886a0e2e8dd4308099705cd815 (patch) | |
tree | b42aee537a6103cd064f9f41ae2889b09b79fd23 /tests/manual/diaglib | |
parent | 1542d8881fc5ccbc5918cd4acbe4091ebbd24508 (diff) | |
parent | cbe332405aa22257d432f1797b325f5e57007c20 (diff) |
Merge remote-tracking branch 'origin/5.7' into dev
Conflicts:
config_help.txt
configure
mkspecs/features/uikit/sdk.prf
src/corelib/global/qhooks.cpp
src/corelib/io/qfilesystemwatcher.cpp
src/corelib/io/qlockfile_unix.cpp
src/corelib/tools/qalgorithms.h
src/gui/kernel/qwindowsysteminterface.h
src/gui/text/qtextdocument_p.cpp
src/network/access/access.pri
src/network/access/qnetworkaccessmanager.cpp
src/network/access/qnetworkreplynsurlconnectionimpl.mm
src/src.pro
src/testlib/qtestcase.cpp
src/widgets/kernel/qwidgetbackingstore_p.h
src/widgets/styles/qwindowscestyle.cpp
src/widgets/styles/qwindowsmobilestyle.cpp
tests/auto/corelib/io/qdiriterator/qdiriterator.pro
tests/auto/corelib/io/qfileinfo/qfileinfo.pro
tests/auto/gui/kernel/qwindow/BLACKLIST
tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
tools/configure/configureapp.cpp
Change-Id: Ibf7fb9c8cf263a810ade82f821345d0725c57c67
Diffstat (limited to 'tests/manual/diaglib')
-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 | ||||
-rw-r--r-- | tests/manual/diaglib/qwidgetdump.cpp | 46 |
5 files changed, 321 insertions, 6 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 diff --git a/tests/manual/diaglib/qwidgetdump.cpp b/tests/manual/diaglib/qwidgetdump.cpp index 0ccf109ebb..10cfde510d 100644 --- a/tests/manual/diaglib/qwidgetdump.cpp +++ b/tests/manual/diaglib/qwidgetdump.cpp @@ -40,11 +40,50 @@ namespace QtDiag { +static const char *qtWidgetClasses[] = { + "QAbstractItemView", "QAbstractScrollArea", "QAbstractSlider", "QAbstractSpinBox", + "QCalendarWidget", "QCheckBox", "QColorDialog", "QColumnView", "QComboBox", + "QCommandLinkButton", "QDateEdit", "QDateTimeEdit", "QDesktopWidget", "QDial", + "QDialog", "QDialogButtonBox", "QDockWidget", "QDoubleSpinBox", "QErrorMessage", + "QFileDialog", "QFontComboBox", "QFontDialog", "QFrame", "QGraphicsView", + "QGroupBox", "QHeaderView", "QInputDialog", "QLCDNumber", "QLabel", "QLineEdit", + "QListView", "QListWidget", "QMainWindow", "QMdiArea", "QMdiSubWindow", "QMenu", + "QMenuBar", "QMessageBox", "QOpenGLWidget", "QPlainTextEdit", "QProgressBar", + "QProgressDialog", "QPushButton", "QRadioButton", "QRubberBand", "QScrollArea", + "QScrollBar", "QSlider", "QSpinBox", "QSplashScreen", "QSplitter", + "QStackedWidget", "QStatusBar", "QTabBar", "QTabWidget", "QTableView", + "QTableWidget", "QTextBrowser", "QTextEdit", "QTimeEdit", "QToolBar", + "QToolBox", "QToolButton", "QTreeView", "QTreeWidget", "QWidget", + "QWizard", "QWizardPage" +}; + +static bool isQtWidget(const char *className) +{ + for (size_t i = 0, count = sizeof(qtWidgetClasses) / sizeof(qtWidgetClasses[0]); i < count; ++i) { + if (!qstrcmp(className, qtWidgetClasses[i])) + return true; + } + return false; +} + +static void formatWidgetClass(QTextStream &str, const QWidget *w) +{ + const QMetaObject *mo = w->metaObject(); + str << mo->className(); + while (!isQtWidget(mo->className())) { + mo = mo->superClass(); + str << ':' << mo->className(); + } + const QString on = w->objectName(); + if (!on.isEmpty()) + str << "/\"" << on << '"'; +} + static void dumpWidgetRecursion(QTextStream &str, const QWidget *w, FormatWindowOptions options, int depth = 0) { indentStream(str, 2 * depth); - formatObject(str, w); + formatWidgetClass(str, w); str << ' ' << (w->isVisible() ? "[visible] " : "[hidden] "); if (const WId nativeWinId = w->internalWinId()) str << "[native: " << hex << showbase << nativeWinId << dec << noshowbase << "] "; @@ -109,7 +148,10 @@ void dumpAllWidgets(FormatWindowOptions options, const QWidget *root) foreach (QWidget *tw, topLevels) dumpWidgetRecursion(str, tw, options); #if QT_VERSION >= 0x050400 - qDebug().noquote() << d; + { + foreach (const QString &line, d.split(QLatin1Char('\n'))) + qDebug().noquote() << line; + } #else qDebug("%s", qPrintable(d)); #endif |