From b791b19d3d00b2725f9f69f519adb3855e46ade9 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Mon, 18 Dec 2023 16:39:34 +0100 Subject: [PATCH] Update Sliders example Simplify the "responsive layout" implementation. Just use a QBoxLayout with changing direction instead of repopulating a QGridLayout, and change the orientation of one set of sliders instead of creating two sets in a stacked layout. Simplify the resizeEvent() implementation accordingly. Update the documentation snippet text to match the code, and document the resizeEvent() override. Fixes: QTBUG-119977 Change-Id: I73a1bb215c956fa283291ebf0ea45ff9a975c727 Reviewed-by: Axel Spoerl (cherry picked from commit f3fb89ba298e1741320d8bfac9cbd0d503373bff) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit 2d3ee8ac34bdf30ffc14054a8aeb64ba292bb96e) --- doc/src/images/sliders-example.png | Bin 18048 -> 23871 bytes examples/widgets/doc/src/sliders.qdoc | 88 ++++++++-------- .../widgets/widgets/sliders/slidersgroup.cpp | 34 +++--- .../widgets/widgets/sliders/slidersgroup.h | 6 +- examples/widgets/widgets/sliders/window.cpp | 97 ++++++------------ examples/widgets/widgets/sliders/window.h | 8 +- 6 files changed, 97 insertions(+), 136 deletions(-) diff --git a/doc/src/images/sliders-example.png b/doc/src/images/sliders-example.png index d2a9c4804d097a92c98f87ee38e02c13a61027de..532f745dfaf0216b5004e3f26841a663849929f1 100644 GIT binary patch literal 23871 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 F`X4U$TG#*p literal 18048 zcmY*>2Rzkn+?9c14iCWYgGZwY*}&gn*x{7m*Fb~{?pGwrKNjVCw�>!aWogpo5HS*4eT<+qEkT!ZpB% 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 diff --git a/examples/widgets/doc/src/sliders.qdoc b/examples/widgets/doc/src/sliders.qdoc index 871adf00490..9bfb4abdc44 100644 --- a/examples/widgets/doc/src/sliders.qdoc +++ b/examples/widgets/doc/src/sliders.qdoc @@ -18,7 +18,8 @@ manipulated through their properties. The example also demonstrates how signals and slots can be used to - synchronize the behavior of two or more widgets. + synchronize the behavior of two or more widgets, and how to override + \l{QWidget::}{resizeEvent()} to implement a responsive layout. \borderedimage sliders-example.png \caption Screenshot of the Sliders example @@ -31,10 +32,8 @@ QScrollBar and a QDial. \li \c Window is the main widget combining a QGroupBox and a - QStackedWidget. In this example, the QStackedWidget provides a - stack of two \c SlidersGroup widgets. The QGroupBox contain - several widgets that control the behavior of the slider-like - widgets. + SlidersGroup. The QGroupBox contains several widgets that control + the behavior of the slider-like widgets. \endlist @@ -56,28 +55,14 @@ \snippet widgets/sliders/window.cpp 0 - In the constructor we first create the two \c SlidersGroup - widgets that display the slider widgets horizontally and - vertically, and add them to the QStackedWidget. QStackedWidget - provides a stack of widgets where only the top widget is visible. - With \c createControls() we create a connection from a - controlling widget to the QStackedWidget, making the user able to - choose between horizontal and vertical orientation of the slider - widgets. The rest of the controlling mechanisms is implemented by - the same function call. + In the constructor we first create the \c SlidersGroup widget + that displays the slider widgets. With \c createControls() we + create the controlling widgets, and connect those to to the + sliders. \snippet widgets/sliders/window.cpp 1 - \snippet widgets/sliders/window.cpp 2 - Then we connect the \c horizontalSliders, \c verticalSliders and - \c valueSpinBox to each other, so that the slider widgets and the - control widget will behave synchronized when the current value of - one of them changes. The \c valueChanged() signal is emitted with - the new value as argument. The \c setValue() slot sets the - current value of the widget to the new value, and emits \c - valueChanged() if the new value is different from the old one. - - We put the group of control widgets and the stacked widget in a + We put the groups of control widgets and the sliders in a horizontal layout before we initialize the minimum, maximum and current values. The initialization of the current value will propagate to the slider widgets through the connection we made @@ -85,15 +70,14 @@ minimum and maximum values propagate through the connections we created with \c createControls(). + \snippet widgets/sliders/window.cpp 2 \snippet widgets/sliders/window.cpp 3 - \snippet widgets/sliders/window.cpp 4 In the private \c createControls() function, we let a QGroupBox (\c controlsGroup) display the control widgets. A group box can provide a frame, a title and a keyboard shortcut, and displays various other widgets inside itself. The group of control widgets - is composed by two checkboxes, three spin boxes (with labels) and - one combobox. + is composed by two checkboxes, and three spin boxes with labels. After creating the labels, we create the two checkboxes. Checkboxes are typically used to represent features in an @@ -131,8 +115,8 @@ bindings are inverted by default: \uicontrol PageDown increases the current value, and \uicontrol PageUp decreases it. + \snippet widgets/sliders/window.cpp 4 \snippet widgets/sliders/window.cpp 5 - \snippet widgets/sliders/window.cpp 6 Then we create the spin boxes. QSpinBox allows the user to choose a value by clicking the up and down buttons or pressing the \uicontrol @@ -141,14 +125,15 @@ manually. The spin boxes control the minimum, maximum and current values for the QSlider, QScrollBar, and QDial widgets. - We create a QComboBox that allows the user to choose the - orientation of the slider widgets. The QComboBox widget is a - combined button and popup list. It provides a means of presenting - a list of options to the user in a way that takes up the minimum - amount of screen space. + \snippet widgets/sliders/window.cpp 6 - \snippet widgets/sliders/window.cpp 7 - \snippet widgets/sliders/window.cpp 8 + Then we connect the \c slidersGroup and the \c valueSpinBox to each + other, so that the slider widgets and the control widget will behave + synchronized when the current value of one of them changes. + The \c valueChanged() signal is emitted with the new value as + argument. The \c setValue() slot sets the current value of the + widget to the new value, and emits \c valueChanged() if the new + value is different from the old one. We synchronize the behavior of the control widgets and the slider widgets through their signals and slots. We connect each control @@ -158,6 +143,17 @@ lay out the control widgets in a QGridLayout within the \c controlsGroup group box. + \snippet widgets/sliders/window.cpp 7 + + Lastly, we override resizeEvent() from QWidget. We guard against + dividing by zero, and otherwise compute the aspect ratio of the + widget. If the window has a portrait format, then we set the + layout to organize the groups of control widgets and sliders + vertically, and we give the sliders a horizontal orientation. + If the window has a landscape format, then we change the layout + to show the sliders and controlling widgets side by side, and + give the sliders a vertical orientation. + \section1 SlidersGroup Class Definition \snippet widgets/sliders/slidersgroup.h 0 @@ -170,7 +166,8 @@ slot with equivalent functionality to the ones in QAbstractSlider and QSpinBox. In addition, we implement several other public slots to set the minimum and maximum value, and invert the slider - widgets' appearance as well as key bindings. + widgets' appearance as well as key bindings, and set the + orientation. \section1 SlidersGroup Class Implementation @@ -183,24 +180,21 @@ focus. The Qt::StrongFocus policy means that the widget accepts focus by both tabbing and clicking. + \snippet widgets/sliders/slidersgroup.cpp 1 + Then we connect the widgets with each other, so that they will stay synchronized when the current value of one of them changes. - \snippet widgets/sliders/slidersgroup.cpp 1 - \snippet widgets/sliders/slidersgroup.cpp 2 - We connect \c {dial}'s \c valueChanged() signal to the \c{SlidersGroup}'s \c valueChanged() signal, to notify the other widgets in the application (i.e., the control widgets) of the changed value. - \snippet widgets/sliders/slidersgroup.cpp 3 \codeline \snippet widgets/sliders/slidersgroup.cpp 4 - Finally, depending on the \l {Qt::Orientation}{orientation} given - at the time of construction, we choose and create the layout for - the slider widgets within the group box. + Finally, we create the layout for the slider widgets within the + group box. We start with a horizontal arrangement of the sliders. \snippet widgets/sliders/slidersgroup.cpp 5 \snippet widgets/sliders/slidersgroup.cpp 6 @@ -233,4 +227,12 @@ \l{QAbstractSlider::invertedAppearance}{invertedAppearance} and \l{QAbstractSlider::invertedControls}{invertedControls} properties. + + \snippet widgets/sliders/slidersgroup.cpp 15 + + The setOrientation() slot controls the direction of the layout + and the orientation of the sliders. In a horizontal group, the + sliders have a horizontal orientation, and are laid out on top + of each other. In a vertical group, the sliders have a vertical + orientation, and are laid out next to each other. */ diff --git a/examples/widgets/widgets/sliders/slidersgroup.cpp b/examples/widgets/widgets/sliders/slidersgroup.cpp index c5d01cdb375..87841c43f9b 100644 --- a/examples/widgets/widgets/sliders/slidersgroup.cpp +++ b/examples/widgets/widgets/sliders/slidersgroup.cpp @@ -9,39 +9,28 @@ #include //! [0] -SlidersGroup::SlidersGroup(Qt::Orientation orientation, const QString &title, - QWidget *parent) +SlidersGroup::SlidersGroup(const QString &title, QWidget *parent) : QGroupBox(title, parent) { - slider = new QSlider(orientation); + slider = new QSlider; slider->setFocusPolicy(Qt::StrongFocus); slider->setTickPosition(QSlider::TicksBothSides); slider->setTickInterval(10); slider->setSingleStep(1); - scrollBar = new QScrollBar(orientation); + scrollBar = new QScrollBar; scrollBar->setFocusPolicy(Qt::StrongFocus); dial = new QDial; dial->setFocusPolicy(Qt::StrongFocus); +//! [0] //! [1] connect(slider, &QSlider::valueChanged, scrollBar, &QScrollBar::setValue); connect(scrollBar, &QScrollBar::valueChanged, dial, &QDial::setValue); connect(dial, &QDial::valueChanged, slider, &QSlider::setValue); -//! [0] //! [1] connect(dial, &QDial::valueChanged, this, &SlidersGroup::valueChanged); -//! [1] //! [2] - -//! [2] //! [3] - QBoxLayout::Direction direction; -//! [3] //! [4] - - if (orientation == Qt::Horizontal) - direction = QBoxLayout::TopToBottom; - else - direction = QBoxLayout::LeftToRight; - - QBoxLayout *slidersLayout = new QBoxLayout(direction); +//! [1] //! [4] + slidersLayout = new QBoxLayout(QBoxLayout::LeftToRight); slidersLayout->addWidget(slider); slidersLayout->addWidget(scrollBar); slidersLayout->addWidget(dial); @@ -96,3 +85,14 @@ void SlidersGroup::invertKeyBindings(bool invert) dial->setInvertedControls(invert); } //! [14] + +//! [15] +void SlidersGroup::setOrientation(Qt::Orientation orientation) +{ + slidersLayout->setDirection(orientation == Qt::Horizontal + ? QBoxLayout::TopToBottom + : QBoxLayout::LeftToRight); + scrollBar->setOrientation(orientation); + slider->setOrientation(orientation); +} +//! [15] diff --git a/examples/widgets/widgets/sliders/slidersgroup.h b/examples/widgets/widgets/sliders/slidersgroup.h index 66821ca5589..7e7d8870183 100644 --- a/examples/widgets/widgets/sliders/slidersgroup.h +++ b/examples/widgets/widgets/sliders/slidersgroup.h @@ -10,6 +10,7 @@ QT_BEGIN_NAMESPACE class QDial; class QScrollBar; class QSlider; +class QBoxLayout; QT_END_NAMESPACE //! [0] @@ -18,8 +19,7 @@ class SlidersGroup : public QGroupBox Q_OBJECT public: - SlidersGroup(Qt::Orientation orientation, const QString &title, - QWidget *parent = nullptr); + SlidersGroup(const QString &title, QWidget *parent = nullptr); signals: void valueChanged(int value); @@ -30,11 +30,13 @@ public slots: void setMaximum(int value); void invertAppearance(bool invert); void invertKeyBindings(bool invert); + void setOrientation(Qt::Orientation orientation); private: QSlider *slider; QScrollBar *scrollBar; QDial *dial; + QBoxLayout *slidersLayout; }; //! [0] diff --git a/examples/widgets/widgets/sliders/window.cpp b/examples/widgets/widgets/sliders/window.cpp index a2c2fe89eb7..c62c3b83f58 100644 --- a/examples/widgets/widgets/sliders/window.cpp +++ b/examples/widgets/widgets/sliders/window.cpp @@ -13,29 +13,15 @@ Window::Window(QWidget *parent) : QWidget(parent) { - horizontalSliders = new SlidersGroup(Qt::Horizontal, tr("Horizontal")); - verticalSliders = new SlidersGroup(Qt::Vertical, tr("Vertical")); - - stackedWidget = new QStackedWidget; - stackedWidget->addWidget(horizontalSliders); - stackedWidget->addWidget(verticalSliders); + slidersGroup = new SlidersGroup(tr("Sliders")); createControls(tr("Controls")); //! [0] //! [1] - connect(horizontalSliders, &SlidersGroup::valueChanged, -//! [1] //! [2] - verticalSliders, &SlidersGroup::setValue); - connect(verticalSliders, &SlidersGroup::valueChanged, - valueSpinBox, &QSpinBox::setValue); - connect(valueSpinBox, &QSpinBox::valueChanged, - horizontalSliders, &SlidersGroup::setValue); - - layout = new QGridLayout; - layout->addWidget(stackedWidget, 0, 1); - layout->addWidget(controlsGroup, 0, 0); - + layout = new QBoxLayout(QBoxLayout::LeftToRight); + layout->addWidget(controlsGroup); + layout->addWidget(slidersGroup); setLayout(layout); minimumSpinBox->setValue(0); @@ -44,11 +30,11 @@ Window::Window(QWidget *parent) setWindowTitle(tr("Sliders")); } -//! [2] +//! [1] -//! [3] +//! [2] void Window::createControls(const QString &title) -//! [3] //! [4] +//! [2] //! [3] { controlsGroup = new QGroupBox(title); @@ -59,9 +45,9 @@ void Window::createControls(const QString &title) invertedAppearance = new QCheckBox(tr("Inverted appearance")); invertedKeyBindings = new QCheckBox(tr("Inverted key bindings")); -//! [4] //! [5] +//! [3] //! [4] minimumSpinBox = new QSpinBox; -//! [5] //! [6] +//! [4] //! [5] minimumSpinBox->setRange(-100, 100); minimumSpinBox->setSingleStep(1); @@ -73,30 +59,19 @@ void Window::createControls(const QString &title) valueSpinBox->setRange(-100, 100); valueSpinBox->setSingleStep(1); - orientationCombo = new QComboBox; - orientationCombo->addItem(tr("Horizontal slider-like widgets")); - orientationCombo->addItem(tr("Vertical slider-like widgets")); - -//! [6] //! [7] - connect(orientationCombo, &QComboBox::activated, -//! [7] //! [8] - stackedWidget, &QStackedWidget::setCurrentIndex); +//! [5] //! [6] + connect(slidersGroup, &SlidersGroup::valueChanged, + valueSpinBox, &QSpinBox::setValue); + connect(valueSpinBox, &QSpinBox::valueChanged, + slidersGroup, &SlidersGroup::setValue); connect(minimumSpinBox, &QSpinBox::valueChanged, - horizontalSliders, &SlidersGroup::setMinimum); - connect(minimumSpinBox, &QSpinBox::valueChanged, - verticalSliders, &SlidersGroup::setMinimum); + slidersGroup, &SlidersGroup::setMinimum); connect(maximumSpinBox, &QSpinBox::valueChanged, - horizontalSliders, &SlidersGroup::setMaximum); - connect(maximumSpinBox, &QSpinBox::valueChanged, - verticalSliders, &SlidersGroup::setMaximum); + slidersGroup, &SlidersGroup::setMaximum); connect(invertedAppearance, &QCheckBox::toggled, - horizontalSliders, &SlidersGroup::invertAppearance); - connect(invertedAppearance, &QCheckBox::toggled, - verticalSliders, &SlidersGroup::invertAppearance); + slidersGroup, &SlidersGroup::invertAppearance); connect(invertedKeyBindings, &QCheckBox::toggled, - horizontalSliders, &SlidersGroup::invertKeyBindings); - connect(invertedKeyBindings, &QCheckBox::toggled, - verticalSliders, &SlidersGroup::invertKeyBindings); + slidersGroup, &SlidersGroup::invertKeyBindings); QGridLayout *controlsLayout = new QGridLayout; controlsLayout->addWidget(minimumLabel, 0, 0); @@ -107,40 +82,26 @@ void Window::createControls(const QString &title) controlsLayout->addWidget(valueSpinBox, 2, 1); controlsLayout->addWidget(invertedAppearance, 0, 2); controlsLayout->addWidget(invertedKeyBindings, 1, 2); - controlsLayout->addWidget(orientationCombo, 3, 0, 1, 3); controlsGroup->setLayout(controlsLayout); } -//! [8] +//! [6] -void Window::resizeEvent(QResizeEvent *e) +//! [7] +void Window::resizeEvent(QResizeEvent *) { - Q_UNUSED(e); if (width() == 0 || height() == 0) return; - const double aspectRatio = double(width()) / double(height()); + const double aspectRatio = double(width()) / double(height()); - if ((aspectRatio < 1.0) && (oldAspectRatio > 1.0)) { - layout->removeWidget(controlsGroup); - layout->removeWidget(stackedWidget); - - layout->addWidget(stackedWidget, 1, 0); - layout->addWidget(controlsGroup, 0, 0); - - oldAspectRatio = aspectRatio; - } - else if ((aspectRatio > 1.0) && (oldAspectRatio < 1.0)) { - layout->removeWidget(controlsGroup); - layout->removeWidget(stackedWidget); - - layout->addWidget(stackedWidget, 0, 1); - layout->addWidget(controlsGroup, 0, 0); - - oldAspectRatio = aspectRatio; + if (aspectRatio < 1.0) { + layout->setDirection(QBoxLayout::TopToBottom); + slidersGroup->setOrientation(Qt::Horizontal); + } else if (aspectRatio > 1.0) { + layout->setDirection(QBoxLayout::LeftToRight); + slidersGroup->setOrientation(Qt::Vertical); } } - - - +//! [7] diff --git a/examples/widgets/widgets/sliders/window.h b/examples/widgets/widgets/sliders/window.h index fa627eabd3a..8d7338f27c2 100644 --- a/examples/widgets/widgets/sliders/window.h +++ b/examples/widgets/widgets/sliders/window.h @@ -29,9 +29,7 @@ private: void createControls(const QString &title); void resizeEvent(QResizeEvent *e); - SlidersGroup *horizontalSliders; - SlidersGroup *verticalSliders; - QStackedWidget *stackedWidget; + SlidersGroup *slidersGroup; QGroupBox *controlsGroup; QLabel *minimumLabel; @@ -42,9 +40,7 @@ private: QSpinBox *minimumSpinBox; QSpinBox *maximumSpinBox; QSpinBox *valueSpinBox; - QComboBox *orientationCombo; - QGridLayout *layout; - double oldAspectRatio; + QBoxLayout *layout; }; //! [0]