qt5base-lts/tests/manual/highdpi/dprgadget/main.cpp
Morten Johan Sørvig 74cae2580f Update DprGadadget
Display active environment variables. Reorder the
labels with device independent values to the left
and native values to the right. Display the Qt scale
factor.

Change-Id: If95c252b06eff5abd91a25847777246effe94be2
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2021-04-19 18:45:39 +02:00

280 lines
11 KiB
C++

/****************************************************************************
**
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** 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 https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtGui/qpa/qplatformscreen.h>
#include <QtGui/qpa/qplatformwindow.h>
#include <QtGui/private/qhighdpiscaling_p.h>
#include <QtWidgets/QtWidgets>
#include <iostream>
/*
DprGadget: The focused High-DPI settings debug utility
DprGadget displays the device pixel ratio ("DPR") for the screen
it's on in a large font, as well as the inputs (from the platform
plugin or environment) currently in use for determinging the DPR.
Non-relevant inputs are not displayed. See qttools/src/qtdiag for
an utility which displays all inputs.
*/
bool g_qtScaleFactor = false;
bool g_qtUsePhysicalDpi = false;
bool g_qtFontDpi = false;
bool g_qtScaleFactorRoundingPolicy = false;
bool g_displayEvents = false;
class DprGadget : public QWidget
{
public:
std::function<void(void)> m_clearFn;
std::function<void(void)> m_updateFn;
qreal m_currentDpr = -1;
QString m_eventsText;
DprGadget() {
setWindowTitle(QString("DprGadget - Qt %1").arg(qVersion()));
QFont tinyFont;
tinyFont.setPointSize(8);
QFont smallFont;
smallFont.setPointSize(12);
QFont bigFont;
bigFont.setPointSize(42);
QFont biggerFont;
biggerFont.setPointSize(80);
QLabel *dprLabel = new QLabel("Device Pixel Ratio");
dprLabel->setFont(bigFont);
dprLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
QLabel *dprValue = new QLabel();
dprValue->setFont(biggerFont);
dprValue->setTextInteractionFlags(Qt::TextSelectableByMouse);
QLabel *screenLabel = new QLabel("Current Screen:");
screenLabel->setFont(smallFont);
QLabel *sizeLabel = new QLabel("Window size:");
sizeLabel->setFont(smallFont);
sizeLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
QLabel *nativeSizeLabel = new QLabel("Native:");
nativeSizeLabel->setFont(smallFont);
nativeSizeLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
QLabel *dpiLabel = new QLabel("Logical DPI:");
dpiLabel->setFont(smallFont);
dpiLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
QLabel *windowDpiLabel = new QLabel("Window DPI:");
windowDpiLabel->setFont(smallFont);
windowDpiLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
QLabel *platformDpiLabel = new QLabel("Native Device Pixel Ratio:");
platformDpiLabel->setFont(smallFont);
platformDpiLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
QLabel *windowDprLabel = new QLabel("Window DPR:");
windowDprLabel->setFont(smallFont);
windowDprLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
QLabel *plarformDprLabel = new QLabel("Native DPI:");
plarformDprLabel->setFont(smallFont);
plarformDprLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
QLabel *qtScaleFactorLabel = new QLabel("Qt Internal Scale Factor:");
qtScaleFactorLabel->setFont(smallFont);
QLabel *eventsLabel = new QLabel(m_eventsText);
eventsLabel->setFont(tinyFont);
eventsLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(dprLabel);
layout->setAlignment(dprLabel, Qt::AlignHCenter);
layout->addWidget(dprValue);
layout->setAlignment(dprValue, Qt::AlignHCenter);
bool displayLogicalDpi = false;
if (displayLogicalDpi)
layout->addWidget(dpiLabel);
layout->addStretch();
QHBoxLayout *screenLabelLayout = new QHBoxLayout();
screenLabelLayout->addStretch();
screenLabelLayout->addWidget(screenLabel);
screenLabelLayout->addStretch();
layout->addLayout(screenLabelLayout);
QHBoxLayout *windowSizeLayout = new QHBoxLayout();
windowSizeLayout->addWidget(sizeLabel);
windowSizeLayout->addStretch();
windowSizeLayout->addWidget(nativeSizeLabel);
layout->addLayout(windowSizeLayout);
QHBoxLayout *dpiLayout = new QHBoxLayout();
dpiLayout->addWidget(windowDpiLabel);
dpiLayout->addStretch();
dpiLayout->addWidget(platformDpiLabel);
layout->addLayout(dpiLayout);
QHBoxLayout *dprLayout = new QHBoxLayout();
dprLayout->addWidget(windowDprLabel);
dprLayout->addStretch();
dprLayout->addWidget(plarformDprLabel);
layout->addLayout(dprLayout);
QHBoxLayout *qtScaleFactorLabelLayout = new QHBoxLayout();
qtScaleFactorLabelLayout->addStretch();
qtScaleFactorLabelLayout->addWidget(qtScaleFactorLabel);
qtScaleFactorLabelLayout->addStretch();
layout->addLayout(qtScaleFactorLabelLayout);
if (g_displayEvents)
layout->addWidget(eventsLabel);
bool activeEnvironment = g_qtScaleFactor || g_qtUsePhysicalDpi || g_qtFontDpi || g_qtScaleFactorRoundingPolicy;
if (activeEnvironment) {
layout->addWidget(new QLabel("Active Environment:"));
if (g_qtScaleFactor) {
QString text = QString("QT_SCALE_FACTOR=") + qgetenv("QT_SCALE_FACTOR");
layout->addWidget(new QLabel(text));
}
if (g_qtUsePhysicalDpi) {
QString text = QString("QT_USE_PHYSICAL_DPI=") + qgetenv("QT_USE_PHYSICAL_DPI");
layout->addWidget(new QLabel(text));
}
if (g_qtFontDpi) {
QString text = QString("QT_FONT_DPI=") + qgetenv("QT_FONT_DPI");
layout->addWidget(new QLabel(text));
}
if (g_qtScaleFactorRoundingPolicy) {
QString text = QString("QT_SCALE_FACTOR_ROUNDING_POLICY=") + qgetenv("QT_SCALE_FACTOR_ROUNDING_POLICY");
layout->addWidget(new QLabel(text));
}
}
auto updateValues = [=]() {
dprValue->setText(QString("%1").arg(devicePixelRatioF()));
windowDpiLabel->setText(QString("QWindow DPI: %1").arg(logicalDpiX()));
dpiLabel->setText(QString("Logical DPI: %1").arg(logicalDpiX()));
sizeLabel->setText(QString("QWindow size: %1 %2").arg(width()).arg(height()));
QPlatformWindow *platformWindow = windowHandle()->handle();
nativeSizeLabel->setText(QString("native size %1 %2").arg(platformWindow->geometry().width())
.arg(platformWindow->geometry().height()));
QPlatformScreen *pscreen = screen()->handle();
if (g_qtUsePhysicalDpi) {
int physicalDpi = qRound(pscreen->geometry().width() / pscreen->physicalSize().width() * qreal(25.4));
platformDpiLabel->setText(QString("Native Physical DPI: %1").arg(physicalDpi));
} else {
platformDpiLabel->setText(QString("native logical DPI: %1").arg(pscreen->logicalDpi().first));
}
windowDprLabel->setText(QString("QWindow DPR: %1").arg(windowHandle()->devicePixelRatio()));
plarformDprLabel->setText(QString("native DPR: %1").arg(pscreen->devicePixelRatio()));
screenLabel->setText(QString("Current Screen: %1").arg(screen()->name()));
qtScaleFactorLabel->setText(QString("Qt Internal Scale Factor: %1").arg(QHighDpiScaling::factor(windowHandle())));
eventsLabel->setText(QString(m_eventsText));
};
m_updateFn = updateValues;
m_clearFn = [=]() {
dprValue->setText(QString(""));
m_eventsText.clear();
};
create();
QObject::connect(this->windowHandle(), &QWindow::screenChanged, [updateValues, this](QScreen *screen){
Q_UNUSED(screen);
this->m_eventsText.prepend(QString("ScreenChange "));
this->m_eventsText.truncate(80);
updateValues();
});
setLayout(layout);
updateValues();
}
void paintEvent(QPaintEvent *) override {
// Update the UI in the paint event - normally not good
// practice but it looks like we can get away with it here
this->m_eventsText.prepend(QString("Paint "));
this->m_eventsText.truncate(80);
// Dpr change should trigger a repaint, update display values here
if (m_currentDpr == devicePixelRatioF())
return;
m_currentDpr = devicePixelRatioF();
m_updateFn();
}
void resizeEvent(QResizeEvent *event) override {
QSize size = event->size();
m_eventsText.prepend(QString("Resize(%1 %2) ").arg(size.width()).arg(size.height()));
m_eventsText.truncate(80);
m_updateFn();
}
void mousePressEvent(QMouseEvent *) override {
m_clearFn();
QTimer::singleShot(500, this, [this](){
m_updateFn();
});
}
};
int main(int argc, char **argv) {
// Set sensible defaults
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
// Display any set high-dpi eviornment variable.
g_qtScaleFactor = qEnvironmentVariableIsSet("QT_SCALE_FACTOR");
g_qtUsePhysicalDpi = qgetenv("QT_USE_PHYSICAL_DPI") == QByteArray("1");
g_qtFontDpi = qEnvironmentVariableIsSet("QT_FONT_DPI");
g_qtScaleFactorRoundingPolicy = qEnvironmentVariableIsSet("QT_SCALE_FACTOR_ROUNDING_POLICY");
QApplication app(argc, argv);
DprGadget dprGadget;
dprGadget.show();
return app.exec();
}