From 975b63d1d54663a8196ca2fa95f66fac664541e5 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Tue, 23 Jun 2015 12:56:06 +0200 Subject: Show initial scale factors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Initialize the sliders to the currently active factors. ...and fix up the layout so the sliders align properly, and aren't squashed when resizing. Change-Id: I37ef853b0fd5a26939134da7116778f898f52a88 Reviewed-by: Morten Johan Sørvig --- tests/manual/highdpi/main.cpp | 80 ++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 28 deletions(-) (limited to 'tests/manual/highdpi/main.cpp') diff --git a/tests/manual/highdpi/main.cpp b/tests/manual/highdpi/main.cpp index 4d822b4aa3..dde330ef88 100644 --- a/tests/manual/highdpi/main.cpp +++ b/tests/manual/highdpi/main.cpp @@ -96,30 +96,39 @@ private: QCommandLineOption m_option; }; -class LabelSlider : public QWidget +class LabelSlider : public QObject { Q_OBJECT public: - LabelSlider(const QString &text) { - QHBoxLayout *row = new QHBoxLayout(this); - QLabel *label = new QLabel(text); - QSlider *slider = new QSlider(); - slider->setOrientation(Qt::Horizontal); - slider->setMinimum(1); - slider->setMaximum(40); - slider->setValue(10); - slider->setTracking(false); - slider->setTickInterval(5); - slider->setTickPosition(QSlider::TicksBelow); - QLabel *scaleFactorLabel = new QLabel("1.0"); + LabelSlider(QObject *parent, const QString &text, QGridLayout *layout, int row) + : QObject(parent) + { + QLabel *textLabel = new QLabel(text); + m_slider = new QSlider(); + m_slider->setOrientation(Qt::Horizontal); + m_slider->setMinimum(1); + m_slider->setMaximum(40); + m_slider->setValue(10); + m_slider->setTracking(false); + m_slider->setTickInterval(5); + m_slider->setTickPosition(QSlider::TicksBelow); + m_label = new QLabel("1.0"); // set up layouts - row->addWidget(label); - row->addWidget(slider); - row->addWidget(scaleFactorLabel); + layout->addWidget(textLabel, row, 0); + layout->addWidget(m_slider, row, 1); + layout->addWidget(m_label, row, 2); // handle slider position change - connect(slider, &QSlider::sliderMoved, [scaleFactorLabel](int scaleFactor){ + connect(m_slider, &QSlider::sliderMoved, this, &LabelSlider::updateLabel); + connect(m_slider, &QSlider::valueChanged, this, &LabelSlider::valueChanged); + } + void setValue(int scaleFactor) { + m_slider->setValue(scaleFactor); + updateLabel(scaleFactor); + } +private slots: + void updateLabel(int scaleFactor) { // slider value is scale factor times ten; qreal scalefactorF = qreal(scaleFactor) / 10.0; @@ -127,15 +136,29 @@ public: QString number = QString::number(scalefactorF); if (!number.contains(".")) number.append(".0"); - scaleFactorLabel->setText(number); - }); - connect(slider, &QSlider::valueChanged, this, &LabelSlider::valueChanged); - setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); + m_label->setText(number); } signals: void valueChanged(int scaleFactor); +private: + QSlider *m_slider; + QLabel *m_label; }; +static qreal getScreenFactorWithoutPixelDensity(const QScreen *screen) +{ + // this is a hack that relies on knowing the internals of QHighDpiScaling + static const char *scaleFactorProperty = "_q_scaleFactor"; + QVariant screenFactor = screen->property(scaleFactorProperty); + return screenFactor.isValid() ? screenFactor.toReal() : 1.0; +} + +static inline qreal getGlobalScaleFactor() +{ + QScreen *noScreen = 0; + return QHighDpiScaling::factor(noScreen); +} + class DemoController : public QWidget { Q_OBJECT @@ -155,17 +178,18 @@ DemoController::DemoController(DemoContainerList *demos, QCommandLineParser *par setWindowTitle("screen scale factors"); setObjectName("controller"); // make WindowScaleFactorSetter skip this window - QVBoxLayout *layout = new QVBoxLayout; + QGridLayout *layout = new QGridLayout; setLayout(layout); - LabelSlider *globalScaleSlider = new LabelSlider("Global scale factor"); + int layoutRow = 0; + LabelSlider *globalScaleSlider = new LabelSlider(this, "Global scale factor", layout, layoutRow++); + globalScaleSlider->setValue(int(getGlobalScaleFactor() * 10)); connect(globalScaleSlider, &LabelSlider::valueChanged, [](int scaleFactor){ // slider value is scale factor times ten; qreal scalefactorF = qreal(scaleFactor) / 10.0; QHighDpiScaling::setGlobalFactor(scalefactorF); }); - layout->addWidget(globalScaleSlider); - layout->addStretch(); + // set up one scale control line per screen QList screens = QGuiApplication::screens(); foreach (QScreen *screen, screens) { @@ -173,8 +197,8 @@ DemoController::DemoController(DemoContainerList *demos, QCommandLineParser *par QSize screenSize = screen->geometry().size(); QString screenId = screen->name() + " " + QString::number(screenSize.width()) + " " + QString::number(screenSize.height()); - LabelSlider *slider = new LabelSlider(screenId); - layout->addWidget(slider); + LabelSlider *slider = new LabelSlider(this, screenId, layout, layoutRow++); + slider->setValue(getScreenFactorWithoutPixelDensity(screen) * 10); // handle slider value change connect(slider, &LabelSlider::valueChanged, [screen](int scaleFactor){ @@ -198,7 +222,7 @@ DemoController::DemoController(DemoContainerList *demos, QCommandLineParser *par QPushButton *button = new QPushButton(demo->name()); button->setToolTip(demo->option().description()); button->setCheckable(true); - layout->addWidget(button); + layout->addWidget(button, layoutRow++, 0, 1, -1); m_group->addButton(button, i); if (parser->isSet(demo->option())) { -- cgit v1.2.3