Dynamic Layouts Example▲
Sélectionnez
/**
**************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** 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.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
***************************************************************************
*/
#include <QtWidgets>
#include
"dialog.h"
Dialog::
Dialog(QWidget *
parent)
:
QDialog(parent)
{
createRotatableGroupBox();
createOptionsGroupBox();
createButtonBox();
mainLayout =
new
QGridLayout;
mainLayout-&
gt;addWidget(rotatableGroupBox, 0
, 0
);
mainLayout-&
gt;addWidget(optionsGroupBox, 1
, 0
);
mainLayout-&
gt;addWidget(buttonBox, 2
, 0
);
setLayout(mainLayout);
mainLayout-&
gt;setSizeConstraint(QLayout::
SetMinimumSize);
setWindowTitle(tr("Dynamic Layouts"
));
}
void
Dialog::
buttonsOrientationChanged(int
index)
{
mainLayout-&
gt;setSizeConstraint(QLayout::
SetNoConstraint);
setMinimumSize(0
, 0
);
Qt::
Orientation orientation =
Qt::
Orientation(
buttonsOrientationComboBox-&
gt;itemData(index).toInt());
if
(orientation ==
buttonBox-&
gt;orientation())
return
;
mainLayout-&
gt;removeWidget(buttonBox);
int
spacing =
mainLayout-&
gt;spacing();
QSize oldSizeHint =
buttonBox-&
gt;sizeHint() +
QSize(spacing, spacing);
buttonBox-&
gt;setOrientation(orientation);
QSize newSizeHint =
buttonBox-&
gt;sizeHint() +
QSize(spacing, spacing);
if
(orientation ==
Qt::
Horizontal) {
mainLayout-&
gt;addWidget(buttonBox, 2
, 0
);
resize(size() +
QSize(-
oldSizeHint.width(), newSizeHint.height()));
}
else
{
mainLayout-&
gt;addWidget(buttonBox, 0
, 3
, 2
, 1
);
resize(size() +
QSize(newSizeHint.width(), -
oldSizeHint.height()));
}
mainLayout-&
gt;setSizeConstraint(QLayout::
SetDefaultConstraint);
}
void
Dialog::
rotateWidgets()
{
Q_ASSERT(rotatableWidgets.count() %
2
==
0
);
foreach (QWidget *
widget, rotatableWidgets)
rotatableLayout-&
gt;removeWidget(widget);
rotatableWidgets.enqueue(rotatableWidgets.dequeue());
const
int
n =
rotatableWidgets.count();
for
(int
i =
0
; i &
lt; n /
2
; ++
i) {
rotatableLayout-&
gt;addWidget(rotatableWidgets[n -
i -
1
], 0
, i);
rotatableLayout-&
gt;addWidget(rotatableWidgets[i], 1
, i);
}
}
void
Dialog::
help()
{
QMessageBox::
information(this
, tr("Dynamic Layouts Help"
),
tr("This example shows how to change layouts "
"dynamically."
));
}
void
Dialog::
createRotatableGroupBox()
{
rotatableGroupBox =
new
QGroupBox(tr("Rotatable Widgets"
));
rotatableWidgets.enqueue(new
QSpinBox);
rotatableWidgets.enqueue(new
QSlider);
rotatableWidgets.enqueue(new
QDial);
rotatableWidgets.enqueue(new
QProgressBar);
int
n =
rotatableWidgets.count();
for
(int
i =
0
; i &
lt; n; ++
i) {
connect(rotatableWidgets[i], SIGNAL(valueChanged(int
)),
rotatableWidgets[(i +
1
) %
n], SLOT(setValue(int
)));
}
rotatableLayout =
new
QGridLayout;
rotatableGroupBox-&
gt;setLayout(rotatableLayout);
rotateWidgets();
}
void
Dialog::
createOptionsGroupBox()
{
optionsGroupBox =
new
QGroupBox(tr("Options"
));
buttonsOrientationLabel =
new
QLabel(tr("Orientation of buttons:"
));
buttonsOrientationComboBox =
new
QComboBox;
buttonsOrientationComboBox-&
gt;addItem(tr("Horizontal"
), Qt::
Horizontal);
buttonsOrientationComboBox-&
gt;addItem(tr("Vertical"
), Qt::
Vertical);
connect(buttonsOrientationComboBox,
QOverload&
lt;int
&
gt;::
of(&
amp;QComboBox::
currentIndexChanged),
this
,
&
amp;Dialog::
buttonsOrientationChanged);
optionsLayout =
new
QGridLayout;
optionsLayout-&
gt;addWidget(buttonsOrientationLabel, 0
, 0
);
optionsLayout-&
gt;addWidget(buttonsOrientationComboBox, 0
, 1
);
optionsLayout-&
gt;setColumnStretch(2
, 1
);
optionsGroupBox-&
gt;setLayout(optionsLayout);
}
void
Dialog::
createButtonBox()
{
buttonBox =
new
QDialogButtonBox;
closeButton =
buttonBox-&
gt;addButton(QDialogButtonBox::
Close);
helpButton =
buttonBox-&
gt;addButton(QDialogButtonBox::
Help);
rotateWidgetsButton =
buttonBox-&
gt;addButton(tr("Rotate &Widgets"
),
QDialogButtonBox::
ActionRole);
connect(rotateWidgetsButton, &
amp;QPushButton::
clicked, this
, &
amp;Dialog::
rotateWidgets);
connect(closeButton, &
amp;QPushButton::
clicked, this
, &
amp;Dialog::
close);
connect(helpButton, &
amp;QPushButton::
clicked, this
, &
amp;Dialog::
help);
}