C++/Qt/QStackedWidget
QStackedWidget based wizard
<source lang="cpp">
Foundations of Qt Development\Chapter09\wizard\main.cpp /*
* Copyright (c) 2006-2007, Johan Thelin * * All rights reserved. * * 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 APress 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. * */
- include <QApplication>
- include "wizard.h"
int main( int argc, char **argv ) {
QApplication app( argc, argv ); Wizard dlg; dlg.show(); return app.exec();
}
Foundations of Qt Development\Chapter09\wizard\wizard.cpp /*
* Copyright (c) 2006-2007, Johan Thelin * * All rights reserved. * * 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 APress 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. * */
- include <QWidget>
- include <QCheckBox>
- include <QTextEdit>
- include <QLabel>
- include <QStackedWidget>
- include <QPushButton>
- include <QGridLayout>
- include <QMessageBox>
- include "wizard.h"
class PageOne : public QWidget { public:
PageOne( QWidget *parent = 0 ); QCheckBox *acceptDeal;
}; PageOne::PageOne( QWidget *parent ) : QWidget(parent) {
QGridLayout *layout = new QGridLayout( this ); QTextEdit *textEdit = new QTextEdit(); textEdit->setReadOnly( true );textEdit->setHtml( tr("
The Rules
" "The rules are to be followed!
") );acceptDeal = new QCheckBox( tr("I accept") ); layout->addWidget( textEdit, 0, 0, 1, 2 ); layout->addWidget( acceptDeal, 1, 1 );
}
class PageTwo : public QWidget { public:
PageTwo( QWidget *parent = 0 ); QCheckBox *doThis; QCheckBox *doThat; QCheckBox *extra;
}; PageTwo::PageTwo( QWidget *parent ) : QWidget(parent) {
QGridLayout *layout = new QGridLayout( this ); doThis = new QCheckBox( tr("Do this") ); doThat = new QCheckBox( tr("Do that") ); extra = new QCheckBox( tr("Add something extra") ); layout->addWidget( doThis, 0, 0 ); layout->addWidget( doThat, 1, 0 ); layout->addWidget( extra, 2, 0 ); layout->setRowMinimumHeight( 3, 0 );
}
class PageThree : public QWidget { public:
PageThree( QWidget *parent = 0 );
}; PageThree::PageThree( QWidget *parent ) : QWidget(parent) {
QGridLayout *layout = new QGridLayout( this ); layout->addWidget( new QLabel( tr("All is ready. Press finish to get it done!") ), 0, 0 );
}
Wizard::Wizard() : QDialog() {
QGridLayout *layout = new QGridLayout( this ); QPushButton *cancel = new QPushButton( tr("Cancel") ); next = new QPushButton( tr("Next") ); previous = new QPushButton( tr("Previous" ) ); pages = new QStackedWidget(); layout->addWidget( pages, 0, 0, 1, 5 ); layout->setColumnMinimumWidth( 0, 50 ); layout->addWidget( previous, 1, 1 ); layout->addWidget( next, 1, 2 ); layout->setColumnMinimumWidth( 3, 5 ); layout->addWidget( cancel, 1, 4 ); previous->setEnabled( false ); next->setEnabled( false ); connect( next, SIGNAL(clicked()), this, SLOT(doNext()) ); connect( previous, SIGNAL(clicked()), this, SLOT(doPrev()) ); connect( cancel, SIGNAL(clicked()), this, SLOT(reject()) ); pages->addWidget( pageOne = new PageOne( pages ) ); pages->addWidget( pageTwo = new PageTwo( pages ) ); pages->addWidget( pageThree = new PageThree( pages ) ); connect( pageOne->acceptDeal, SIGNAL(toggled(bool)), next, SLOT(setEnabled(bool)) );
} void Wizard::doNext() {
switch( pages->currentIndex() ) { case 0: previous->setEnabled( true ); disconnect( pageOne->acceptDeal, SIGNAL(toggled(bool)), next, SLOT(setEnabled(bool)) ); break; case 1: next->setText( tr("Finish") ); break; case 2: QMessageBox::information( this, tr("Finishing"), tr("Here is where the action takes place.") ); accept(); return; } pages->setCurrentIndex( pages->currentIndex()+1 );
} void Wizard::doPrev() {
switch( pages->currentIndex() ) { case 1: previous->setEnabled( false ); next->setEnabled( pageOne->acceptDeal->isChecked() ); connect( pageOne->acceptDeal, SIGNAL(toggled(bool)), next, SLOT(setEnabled(bool)) ); break; case 2: next->setText( tr("Next") ); break; } pages->setCurrentIndex( pages->currentIndex()-1 );
}
Foundations of Qt Development\Chapter09\wizard\wizard.h /*
* Copyright (c) 2006-2007, Johan Thelin * * All rights reserved. * * 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 APress 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. * */
- ifndef WIZARD_H
- define WIZARD_H
- include <QDialog>
class QPushButton; class QStackedWidget; class PageOne; class PageTwo; class PageThree; class Wizard : public QDialog {
Q_OBJECT
public:
Wizard();
private slots:
void doNext(); void doPrev();
private:
QPushButton *next; QPushButton *previous; QStackedWidget *pages; PageOne *pageOne; PageTwo *pageTwo; PageThree *pageThree;
};
- endif // WIZARD_H
</source>
Using QStackedWidget
<source lang="cpp"> /****************************************************************************
- 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 documentation 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$
-
- /
- include <QtGui>
- include <QApplication>
class Widget : public QWidget { public:
Widget(QWidget *parent = 0);
}; Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QWidget *firstPageWidget = new QWidget; QWidget *secondPageWidget = new QWidget; QWidget *thirdPageWidget = new QWidget; QStackedWidget *stackedWidget = new QStackedWidget; stackedWidget->addWidget(firstPageWidget); stackedWidget->addWidget(secondPageWidget); stackedWidget->addWidget(thirdPageWidget); QComboBox *pageComboBox = new QComboBox; pageComboBox->addItem(tr("Page 1")); pageComboBox->addItem(tr("Page 2")); pageComboBox->addItem(tr("Page 3")); connect(pageComboBox, SIGNAL(activated(int)), stackedWidget, SLOT(setCurrentIndex(int))); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(pageComboBox); layout->addWidget(stackedWidget); setLayout(layout);
} int main(int argc, char *argv[]) {
QApplication app(argc, argv); Widget widget; widget.show(); return app.exec();
}
</source>