diff --git a/tests/manual/widgets/styles/main.cpp b/tests/manual/widgets/styles/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..add9afd5b241815c4884ad0dcc20563a7a4c1634 --- /dev/null +++ b/tests/manual/widgets/styles/main.cpp @@ -0,0 +1,232 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite module 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 <QAction> +#include <QApplication> +#include <QDebug> +#include <QGridLayout> +#include <QLabel> +#include <QMainWindow> +#include <QMenu> +#include <QMenuBar> +#include <QPalette> +#include <QPixmap> +#include <QPlainTextEdit> +#include <QStyle> +#include <QTabWidget> +#include <QTextStream> +#include <QVBoxLayout> +#include <QWindow> +#include <QScreen> + +// Format enumeration value and strip off the class name +// added by QDebug: "QStyle::StandardPixmap(SP_Icon)" -> "SP_Icon". +template <typename Enum> +static inline QString formatEnumValue(Enum value) +{ + QString result; + QDebug(&result) << value; + int index = result.indexOf(QLatin1Char('(')); + if (index > 0) { // "QStyle::StandardPixmap(..)". + result.remove(0, index + 1); + index = result.lastIndexOf(QLatin1Char(')')); + if (index > 0) + result.truncate(index); + } + return result; +} + +static QString pixmapDescription(QStyle::StandardPixmap sp, const QPixmap &pixmap) +{ + QString description = formatEnumValue(sp); + QTextStream str(&description); + str << '(' << int(sp) << ") "; + if (pixmap.isNull()) { + str << "(null)"; + } else { + const qreal dpr = pixmap.devicePixelRatioF(); + str << ' ' << pixmap.width() << 'x' << pixmap.height(); + if (!qFuzzyCompare(dpr, qreal(1))) + str << " DPR=" << dpr; + } + return description; +} + +// Display pixmaps returned by QStyle::standardPixmap() in a grid. +static QWidget *createStandardPixmapPage(QWidget *parent) +{ + QWidget *result = new QWidget(parent); + QGridLayout *grid = new QGridLayout(result); + int row = 0; + int column = 0; + const int maxColumns = 6; + for (int i = 0; i <= int(QStyle::SP_LineEditClearButton); ++i) { + const QStyle::StandardPixmap sp = static_cast<QStyle::StandardPixmap>(i); + QPixmap pixmap = result->style()->standardPixmap(sp, Q_NULLPTR, result); + QLabel *descriptionLabel = new QLabel(pixmapDescription(sp, pixmap)); + grid->addWidget(descriptionLabel, row, column++); + QLabel *displayLabel = new QLabel; + displayLabel->setPixmap(pixmap); + displayLabel->setFrameShape(QFrame::Box); + grid->addWidget(displayLabel, row, column++); + if (column >= maxColumns) { + ++row; + column = 0; + } + } + return result; +} + +// Display values returned by QStyle::pixelMetric(). +static QWidget *createMetricsPage(QWidget *parent) +{ + QPlainTextEdit *result = new QPlainTextEdit(parent); + QString text; + QTextStream str(&text); + for (int i = 0; i <= int(QStyle::PM_HeaderDefaultSectionSizeVertical); ++i) { + const QStyle::PixelMetric m = static_cast<QStyle::PixelMetric>(i); + str << formatEnumValue(m) << '(' << int(m) << ")=" + << result->style()->pixelMetric(m, Q_NULLPTR, result) << '\n'; + } + result->setPlainText(text); + return result; +} + +// Display values returned by QStyle::styleHint() +static QWidget *createHintsPage(QWidget *parent) +{ + QPlainTextEdit *result = new QPlainTextEdit(parent); + QString text; + QTextStream str(&text); + for (int i = 0; i <= int(QStyle::SH_Menu_SubMenuDontStartSloppyOnLeave); ++i) { + const QStyle::StyleHint h = static_cast<QStyle::StyleHint>(i); + str << formatEnumValue(h) << '(' << int(h) << ")=" + << result->style()->styleHint(h, Q_NULLPTR, result) << '\n'; + } + result->setPlainText(text); + return result; +} + +// Display palette colors +static QWidget *createColorsPage(QWidget *parent) +{ + QWidget *result = new QWidget(parent); + QGridLayout *grid = new QGridLayout; + const QPalette palette = QGuiApplication::palette(); + int row = 0; + for (int r = 0; r < int(QPalette::NColorRoles); ++r) { + const QPalette::ColorRole role = static_cast<QPalette::ColorRole>(r); + const QColor color = palette.color(QPalette::Active, role); + if (color.isValid()) { + const QString description = + formatEnumValue(role) + QLatin1Char('(') + QString::number(r) + + QLatin1String(") ") + color.name(QColor::HexArgb); + grid->addWidget(new QLabel(description), row, 0); + QLabel *displayLabel = new QLabel; + QPixmap pixmap(20, 20); + pixmap.fill(color); + displayLabel->setPixmap(pixmap); + displayLabel->setFrameShape(QFrame::Box); + grid->addWidget(displayLabel, row, 1); + ++row; + } + } + QHBoxLayout *hBox = new QHBoxLayout; + hBox->addLayout(grid); + hBox->addStretch(); + QVBoxLayout *vBox = new QVBoxLayout(result); + vBox->addLayout(hBox); + vBox->addStretch(); + return result; +} + +class MainWindow : public QMainWindow { + Q_OBJECT +public: + MainWindow(); + +public slots: + void updateDescription(); + +private: + QTabWidget *m_tabWidget; + QLabel *m_descriptionLabel; +}; + +MainWindow::MainWindow() + : m_tabWidget(new QTabWidget) + , m_descriptionLabel(new QLabel) +{ + QMenu *fileMenu = menuBar()->addMenu("&File"); + QAction *a = fileMenu->addAction("Quit", this, &QWidget::close); + a->setShortcut(Qt::CTRL + Qt::Key_Q); + + QWidget *central = new QWidget; + QVBoxLayout *mainLayout = new QVBoxLayout(central); + mainLayout->addWidget(m_descriptionLabel); + mainLayout->addWidget(m_tabWidget); + m_tabWidget->addTab(createStandardPixmapPage(m_tabWidget), "Standard Pixmaps"); + m_tabWidget->addTab(createHintsPage(m_tabWidget), "Hints"); + m_tabWidget->addTab(createMetricsPage(m_tabWidget), "Pixel Metrics"); + m_tabWidget->addTab(createColorsPage(m_tabWidget), "Colors"); + setCentralWidget(central); + + setWindowTitle(QLatin1String("Style Tester (Qt") + QLatin1String(QT_VERSION_STR) + + QLatin1String(", ") + style()->objectName() + QLatin1Char(')')); +} + +void MainWindow::updateDescription() +{ + QString text; + QTextStream str(&text); + str << "Qt " << QT_VERSION_STR << ", platform: " << QGuiApplication::platformName() + << ", Style: \"" << style()->objectName() << "\", DPR=" << devicePixelRatioF() + << ' ' << logicalDpiX() << ',' << logicalDpiY() << "DPI"; + if (const QWindow *w = windowHandle()) + str << ", Screen: \"" << w->screen()->name() << '"'; + m_descriptionLabel->setText(text); +} + +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); + QApplication app(argc, argv); + MainWindow mw; + mw.show(); + mw.updateDescription(); + QObject::connect(mw.windowHandle(), &QWindow::screenChanged, + &mw, &MainWindow::updateDescription); + return app.exec(); +} + +#include "main.moc" diff --git a/tests/manual/widgets/styles/styles.pro b/tests/manual/widgets/styles/styles.pro new file mode 100644 index 0000000000000000000000000000000000000000..ef8217a9a3e331b51f929d395da04d4f99bc843d --- /dev/null +++ b/tests/manual/widgets/styles/styles.pro @@ -0,0 +1,7 @@ +TEMPLATE = app +QT = widgets +CONFIG += console +CONFIG -= app_bundle +CONFIG += c++11 + +SOURCES += main.cpp diff --git a/tests/manual/widgets/widgets.pro b/tests/manual/widgets/widgets.pro index e9dcdf39e795c02e3f73975ff802f594d91ed0ba..3a128581cfee189f15ee27ff92690e3360ab6925 100644 --- a/tests/manual/widgets/widgets.pro +++ b/tests/manual/widgets/widgets.pro @@ -1,3 +1,3 @@ TEMPLATE = subdirs SUBDIRS = itemviews qgraphicsview kernel - +greaterThan(QT_MAJOR_VERSION, 4): SUBDIRS += styles