summaryrefslogtreecommitdiffstats
path: root/tests/manual
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual')
-rw-r--r--tests/manual/diaglib/README.txt11
-rw-r--r--tests/manual/diaglib/diaglib.pri12
-rw-r--r--tests/manual/diaglib/logwidget.cpp164
-rw-r--r--tests/manual/diaglib/logwidget.h94
-rw-r--r--tests/manual/diaglib/qwidgetdump.cpp46
-rw-r--r--tests/manual/shortcuts/main.cpp17
6 files changed, 332 insertions, 12 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
diff --git a/tests/manual/shortcuts/main.cpp b/tests/manual/shortcuts/main.cpp
index 91477d5146..55ade1040a 100644
--- a/tests/manual/shortcuts/main.cpp
+++ b/tests/manual/shortcuts/main.cpp
@@ -92,16 +92,20 @@ protected:
QPushButton *b12 = new QPushButton(sq12.toString());
b12->setShortcut(sq12);
- // LATIN SMALL LETTER O WITH STROKE
- QKeySequence sq13(QString(QChar(ushort(0xf8))));
+ QKeySequence sq13(Qt::ControlModifier + Qt::Key_BracketRight);
QPushButton *b13 = new QPushButton(sq13.toString());
b13->setShortcut(sq13);
- // CYRILLIC SMALL LETTER ZHE
- QKeySequence sq14(QString(QChar(ushort(0x436))));
+ // LATIN SMALL LETTER O WITH STROKE
+ QKeySequence sq14(QString(QChar(ushort(0xf8))));
QPushButton *b14 = new QPushButton(sq14.toString());
b14->setShortcut(sq14);
+ // CYRILLIC SMALL LETTER ZHE
+ QKeySequence sq15(QString(QChar(ushort(0x436))));
+ QPushButton *b15 = new QPushButton(sq15.toString());
+ b15->setShortcut(sq15);
+
QLabel *testPurpose = new QLabel();
testPurpose->setWordWrap(true);
testPurpose->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);
@@ -120,10 +124,11 @@ protected:
layout->addWidget(b10);
layout->addWidget(b11);
layout->addWidget(b12);
- layout->addWidget(new QLabel("Norwegian layout"));
layout->addWidget(b13);
- layout->addWidget(new QLabel("Russian layout"));
+ layout->addWidget(new QLabel("Norwegian layout"));
layout->addWidget(b14);
+ layout->addWidget(new QLabel("Russian layout"));
+ layout->addWidget(b15);
setLayout(layout);
}