C++/Qt/QStackedWidget

Материал из C\C++ эксперт
Перейти к: навигация, поиск

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.
*
*/
  1. include <QApplication>
  2. 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.
*
*/
  1. include <QWidget>
  2. include <QCheckBox>
  3. include <QTextEdit>
  4. include <QLabel>
  5. include <QStackedWidget>
  6. include <QPushButton>
  7. include <QGridLayout>
  8. include <QMessageBox>
  9. 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.
*
*/
  1. ifndef WIZARD_H
  2. define WIZARD_H
  3. 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;

};

  1. 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$
                                                                                                                                                        • /
  1. include <QtGui>
  2. 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>