Mega Code Archive

 
Categories / C++ / Qt
 

Dynamic layout

/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights.  These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include <QQueue> QT_BEGIN_NAMESPACE class QComboBox; class QDialogButtonBox; class QGridLayout; class QGroupBox; class QLabel; class QPushButton; QT_END_NAMESPACE class Dialog : public QDialog {     Q_OBJECT public:     Dialog(QWidget *parent = 0); private slots:     void buttonsOrientationChanged(int index);     void rotateWidgets();     void help(); private:     void createRotableGroupBox();     void createOptionsGroupBox();     void createButtonBox();     QGroupBox *rotableGroupBox;     QQueue<QWidget *> rotableWidgets;     QGroupBox *optionsGroupBox;     QLabel *buttonsOrientationLabel;     QComboBox *buttonsOrientationComboBox;     QDialogButtonBox *buttonBox;     QPushButton *closeButton;     QPushButton *helpButton;     QPushButton *rotateWidgetsButton;     QGridLayout *mainLayout;     QGridLayout *rotableLayout;     QGridLayout *optionsLayout; }; #endif #include <QtGui> #include "dialog.h" Dialog::Dialog(QWidget *parent)     : QDialog(parent) {     createRotableGroupBox();     createOptionsGroupBox();     createButtonBox();     mainLayout = new QGridLayout;     mainLayout->addWidget(rotableGroupBox, 0, 0);     mainLayout->addWidget(optionsGroupBox, 1, 0);     mainLayout->addWidget(buttonBox, 2, 0);     setLayout(mainLayout);     mainLayout->setSizeConstraint(QLayout::SetMinimumSize);     setWindowTitle(tr("Dynamic Layouts")); } void Dialog::buttonsOrientationChanged(int index) {     mainLayout->setSizeConstraint(QLayout::SetNoConstraint);     setMinimumSize(0, 0);     Qt::Orientation orientation = Qt::Orientation(             buttonsOrientationComboBox->itemData(index).toInt());     if (orientation == buttonBox->orientation())         return;     mainLayout->removeWidget(buttonBox);     int spacing = mainLayout->spacing();     QSize oldSizeHint = buttonBox->sizeHint() + QSize(spacing, spacing);     buttonBox->setOrientation(orientation);     QSize newSizeHint = buttonBox->sizeHint() + QSize(spacing, spacing);     if (orientation == Qt::Horizontal) {         mainLayout->addWidget(buttonBox, 2, 0);         resize(size() + QSize(-oldSizeHint.width(), newSizeHint.height()));     } else {         mainLayout->addWidget(buttonBox, 0, 3, 2, 1);         resize(size() + QSize(newSizeHint.width(), -oldSizeHint.height()));     }     mainLayout->setSizeConstraint(QLayout::SetDefaultConstraint); } void Dialog::rotateWidgets() {     Q_ASSERT(rotableWidgets.count() % 2 == 0);     foreach (QWidget *widget, rotableWidgets)         rotableLayout->removeWidget(widget);     rotableWidgets.enqueue(rotableWidgets.dequeue());     const int n = rotableWidgets.count();     for (int i = 0; i < n / 2; ++i) {         rotableLayout->addWidget(rotableWidgets[n - i - 1], 0, i);         rotableLayout->addWidget(rotableWidgets[i], 1, i);     } } void Dialog::help() {     QMessageBox::information(this, tr("Dynamic Layouts Help"),                                tr("This example shows how to change layouts "                                   "dynamically.")); } void Dialog::createRotableGroupBox() {     rotableGroupBox = new QGroupBox(tr("Rotable Widgets"));     rotableWidgets.enqueue(new QSpinBox);     rotableWidgets.enqueue(new QSlider);     rotableWidgets.enqueue(new QDial);     rotableWidgets.enqueue(new QProgressBar);     int n = rotableWidgets.count();     for (int i = 0; i < n; ++i) {         connect(rotableWidgets[i], SIGNAL(valueChanged(int)),                 rotableWidgets[(i + 1) % n], SLOT(setValue(int)));     }     rotableLayout = new QGridLayout;     rotableGroupBox->setLayout(rotableLayout);     rotateWidgets(); } void Dialog::createOptionsGroupBox() {     optionsGroupBox = new QGroupBox(tr("Options"));     buttonsOrientationLabel = new QLabel(tr("Orientation of buttons:"));     buttonsOrientationComboBox = new QComboBox;     buttonsOrientationComboBox->addItem(tr("Horizontal"), Qt::Horizontal);     buttonsOrientationComboBox->addItem(tr("Vertical"), Qt::Vertical);     connect(buttonsOrientationComboBox, SIGNAL(currentIndexChanged(int)),             this, SLOT(buttonsOrientationChanged(int)));     optionsLayout = new QGridLayout;     optionsLayout->addWidget(buttonsOrientationLabel, 0, 0);     optionsLayout->addWidget(buttonsOrientationComboBox, 0, 1);     optionsLayout->setColumnStretch(2, 1);     optionsGroupBox->setLayout(optionsLayout); } void Dialog::createButtonBox() {     buttonBox = new QDialogButtonBox;     closeButton = buttonBox->addButton(QDialogButtonBox::Close);     helpButton = buttonBox->addButton(QDialogButtonBox::Help);     rotateWidgetsButton = buttonBox->addButton(tr("Rotate &Widgets"),                                                QDialogButtonBox::ActionRole);     connect(rotateWidgetsButton, SIGNAL(clicked()), this, SLOT(rotateWidgets()));     connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));     connect(helpButton, SIGNAL(clicked()), this, SLOT(help())); } #include <QApplication> #include "dialog.h" int main(int argc, char *argv[]) {     QApplication app(argc, argv);     Dialog dialog;     return dialog.exec(); }