diff options
author | Morten Johan Sørvig <morten.sorvig@qt.io> | 2021-04-15 15:54:13 +0200 |
---|---|---|
committer | Morten Johan Sørvig <morten.sorvig@qt.io> | 2021-04-19 18:45:39 +0200 |
commit | 74cae2580f5d04913ff343a750823c3441b32b71 (patch) | |
tree | e4fa03cb404ceed0977aee14de11e46fca2a2709 /tests/manual/highdpi/dprgadget/main.cpp | |
parent | fd0c3170c890707c5cea63b11895084d149d991c (diff) |
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>
Diffstat (limited to 'tests/manual/highdpi/dprgadget/main.cpp')
-rw-r--r-- | tests/manual/highdpi/dprgadget/main.cpp | 161 |
1 files changed, 127 insertions, 34 deletions
diff --git a/tests/manual/highdpi/dprgadget/main.cpp b/tests/manual/highdpi/dprgadget/main.cpp index 1cb1134bde..42a0e79c8c 100644 --- a/tests/manual/highdpi/dprgadget/main.cpp +++ b/tests/manual/highdpi/dprgadget/main.cpp @@ -26,8 +26,11 @@ ** ****************************************************************************/ -#include <QtWidgets/QtWidgets> #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 @@ -40,8 +43,12 @@ an utility which displays all inputs. */ -bool g_qtUsePhysicalDpi = false; bool g_qtScaleFactor = false; +bool g_qtUsePhysicalDpi = false; +bool g_qtFontDpi = false; +bool g_qtScaleFactorRoundingPolicy = false; +bool g_displayEvents = false; + class DprGadget : public QWidget { @@ -49,10 +56,13 @@ public: std::function<void(void)> m_clearFn; std::function<void(void)> m_updateFn; qreal m_currentDpr = -1; + QString m_eventsText; DprGadget() { - setWindowTitle("DprGadget"); + setWindowTitle(QString("DprGadget - Qt %1").arg(qVersion())); + QFont tinyFont; + tinyFont.setPointSize(8); QFont smallFont; smallFont.setPointSize(12); QFont bigFont; @@ -68,71 +78,148 @@ public: dprValue->setFont(biggerFont); dprValue->setTextInteractionFlags(Qt::TextSelectableByMouse); - QLabel *dpiLabel = new QLabel("Logical DPI:"); - dpiLabel->setFont(smallFont); - dpiLabel->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:"); - QLabel *plarformDprLabel = new QLabel("Native Logical DPI:"); 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 *screenLabel = new QLabel("Current Screen:"); - screenLabel->setFont(smallFont); + 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); - layout->addWidget(sizeLabel); bool displayLogicalDpi = false; if (displayLogicalDpi) layout->addWidget(dpiLabel); - if (g_qtScaleFactor) { - QString text = QString("QT_SCALE_FACTOR ") + qgetenv("QT_SCALE_FACTOR"); - layout->addWidget(new QLabel(text)); - } - layout->addStretch(); - layout->addWidget(screenLabel); - layout->addWidget(platformDpiLabel); - layout->addWidget(plarformDprLabel); + + 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("Window size: %1 %2").arg(width()).arg(height())); + 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)); + } - if (g_qtUsePhysicalDpi) - platformDpiLabel->setText(QString("Native Physical DPI: TODO")); - else - platformDpiLabel->setText(QString("Native Logical DPI: %1").arg(pscreen->logicalDpi().first)); - - plarformDprLabel->setText(QString("Native Device Pixel Ratio: %1").arg(pscreen->devicePixelRatio())); + 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](QScreen *screen){ + 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(); }); @@ -142,6 +229,12 @@ public: } 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; @@ -150,7 +243,10 @@ public: m_updateFn(); } - void resizeEvent(QResizeEvent *) override { + 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(); } @@ -168,18 +264,15 @@ int main(int argc, char **argv) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); - // react to (some) high-dpi eviornment variables. - g_qtUsePhysicalDpi = qgetenv("QT_USE_PHYSICAL_DPI") == QByteArray("1"); + // 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; - - // Set initial size. We expect this size to be preserved across screen - // and DPI changes - dprGadget.resize(560, 380); - dprGadget.show(); return app.exec(); |