summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@theqtcompany.com>2015-06-23 12:56:06 +0200
committerPaul Olav Tvete <paul.tvete@theqtcompany.com>2015-06-29 10:34:08 +0000
commit975b63d1d54663a8196ca2fa95f66fac664541e5 (patch)
tree6b7aad3b4bb705e4efdd1a6d0b001f4038c1a123
parent38c6d2872cf901ae15efea4bf8352dd1f35f1470 (diff)
Show initial scale factors
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 <morten.sorvig@theqtcompany.com>
-rw-r--r--tests/manual/highdpi/main.cpp80
1 files changed, 52 insertions, 28 deletions
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<QScreen *> 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())) {