C++/Qt/QPushButton — различия между версиями

Материал из C\C++ эксперт
Перейти к: навигация, поиск
м (1 версия: Импорт контента...)
 
(нет различий)

Текущая версия на 13:24, 25 мая 2010

Add clicked event for push button

<source lang="cpp">

  1. include <QApplication>
  2. include <QPushButton>

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   QPushButton *button = new QPushButton("Quit");
   QObject::connect(button, SIGNAL(clicked()),&app, SLOT(quit()));
   button->show();
   return app.exec();

}


 </source>


Button based calculator

<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 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$
                                                                                                                                                        • /
  1. ifndef CALCULATOR_H
  2. define CALCULATOR_H
  3. include <QDialog>

QT_BEGIN_NAMESPACE class QLineEdit; QT_END_NAMESPACE class Button;

class Calculator : public QDialog {

   Q_OBJECT

public:

   Calculator(QWidget *parent = 0);

private slots:

   void digitClicked();
   void unaryOperatorClicked();
   void additiveOperatorClicked();
   void multiplicativeOperatorClicked();
   void equalClicked();
   void pointClicked();
   void changeSignClicked();
   void backspaceClicked();
   void clear();
   void clearAll();
   void clearMemory();
   void readMemory();
   void setMemory();
   void addToMemory();

private:

   Button *createButton(const QString &text, const char *member);
   void abortOperation();
   bool calculate(double rightOperand, const QString &pendingOperator);
   double sumInMemory;

   double sumSoFar;

   double factorSoFar;

   QString pendingAdditiveOperator;

   QString pendingMultiplicativeOperator;

   bool waitingForOperand;
   QLineEdit *display;

   enum { NumDigitButtons = 10 };
   Button *digitButtons[NumDigitButtons];

};

  1. endif


  1. include <QtGui>
  2. include <math.h>
  3. include "button.h"
  4. include "calculator.h"

Calculator::Calculator(QWidget *parent)

   : QDialog(parent)

{

   sumInMemory = 0.0;
   sumSoFar = 0.0;
   factorSoFar = 0.0;
   waitingForOperand = true;
   display = new QLineEdit("0");

   display->setReadOnly(true);
   display->setAlignment(Qt::AlignRight);
   display->setMaxLength(15);
   QFont font = display->font();
   font.setPointSize(font.pointSize() + 8);
   display->setFont(font);
   for (int i = 0; i < NumDigitButtons; ++i) {
 digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked()));
   }
   Button *pointButton = createButton(tr("."), SLOT(pointClicked()));
   Button *changeSignButton = createButton(tr("\261"), SLOT(changeSignClicked()));
   Button *backspaceButton = createButton(tr("Backspace"), SLOT(backspaceClicked()));
   Button *clearButton = createButton(tr("Clear"), SLOT(clear()));
   Button *clearAllButton = createButton(tr("Clear All"), SLOT(clearAll()));
   Button *clearMemoryButton = createButton(tr("MC"), SLOT(clearMemory()));
   Button *readMemoryButton = createButton(tr("MR"), SLOT(readMemory()));
   Button *setMemoryButton = createButton(tr("MS"), SLOT(setMemory()));
   Button *addToMemoryButton = createButton(tr("M+"), SLOT(addToMemory()));
   Button *divisionButton = createButton(tr("\367"), SLOT(multiplicativeOperatorClicked()));
   Button *timesButton = createButton(tr("\327"), SLOT(multiplicativeOperatorClicked()));
   Button *minusButton = createButton(tr("-"), SLOT(additiveOperatorClicked()));
   Button *plusButton = createButton(tr("+"), SLOT(additiveOperatorClicked()));
   Button *squareRootButton = createButton(tr("Sqrt"), SLOT(unaryOperatorClicked()));
   Button *powerButton = createButton(tr("x\262"), SLOT(unaryOperatorClicked()));
   Button *reciprocalButton = createButton(tr("1/x"), SLOT(unaryOperatorClicked()));
   Button *equalButton = createButton(tr("="), SLOT(equalClicked()));
   QGridLayout *mainLayout = new QGridLayout;

   mainLayout->setSizeConstraint(QLayout::SetFixedSize);
   mainLayout->addWidget(display, 0, 0, 1, 6);
   mainLayout->addWidget(backspaceButton, 1, 0, 1, 2);
   mainLayout->addWidget(clearButton, 1, 2, 1, 2);
   mainLayout->addWidget(clearAllButton, 1, 4, 1, 2);
   mainLayout->addWidget(clearMemoryButton, 2, 0);
   mainLayout->addWidget(readMemoryButton, 3, 0);
   mainLayout->addWidget(setMemoryButton, 4, 0);
   mainLayout->addWidget(addToMemoryButton, 5, 0);
   for (int i = 1; i < NumDigitButtons; ++i) {
       int row = ((9 - i) / 3) + 2;
       int column = ((i - 1) % 3) + 1;
       mainLayout->addWidget(digitButtons[i], row, column);
   }
   mainLayout->addWidget(digitButtons[0], 5, 1);
   mainLayout->addWidget(pointButton, 5, 2);
   mainLayout->addWidget(changeSignButton, 5, 3);
   mainLayout->addWidget(divisionButton, 2, 4);
   mainLayout->addWidget(timesButton, 3, 4);
   mainLayout->addWidget(minusButton, 4, 4);
   mainLayout->addWidget(plusButton, 5, 4);
   mainLayout->addWidget(squareRootButton, 2, 5);
   mainLayout->addWidget(powerButton, 3, 5);
   mainLayout->addWidget(reciprocalButton, 4, 5);
   mainLayout->addWidget(equalButton, 5, 5);
   setLayout(mainLayout);
   setWindowTitle(tr("Calculator"));

}

void Calculator::digitClicked() {

   Button *clickedButton = qobject_cast<Button *>(sender());
   int digitValue = clickedButton->text().toInt();
   if (display->text() == "0" && digitValue == 0.0)
       return;
   if (waitingForOperand) {
       display->clear();
 waitingForOperand = false;
   }
   display->setText(display->text() + QString::number(digitValue));

}

void Calculator::unaryOperatorClicked()

{

   Button *clickedButton = qobject_cast<Button *>(sender());
   QString clickedOperator = clickedButton->text();
   double operand = display->text().toDouble();
   double result = 0.0;
   if (clickedOperator == tr("Sqrt")) {
       if (operand < 0.0) {
           abortOperation();
           return;
       }
       result = sqrt(operand);
   } else if (clickedOperator == tr("x\262")) {
       result = pow(operand, 2.0);
   } else if (clickedOperator == tr("1/x")) {
       if (operand == 0.0) {
     abortOperation();
     return;
       }
       result = 1.0 / operand;
   }
   display->setText(QString::number(result));
   waitingForOperand = true;

}

void Calculator::additiveOperatorClicked()

{

   Button *clickedButton = qobject_cast<Button *>(sender());
   QString clickedOperator = clickedButton->text();
   double operand = display->text().toDouble();

   if (!pendingMultiplicativeOperator.isEmpty()) {

       if (!calculate(operand, pendingMultiplicativeOperator)) {
           abortOperation();
     return;
       }
       display->setText(QString::number(factorSoFar));
       operand = factorSoFar;
       factorSoFar = 0.0;
       pendingMultiplicativeOperator.clear();
   }

   if (!pendingAdditiveOperator.isEmpty()) {

       if (!calculate(operand, pendingAdditiveOperator)) {
           abortOperation();
     return;
       }
       display->setText(QString::number(sumSoFar));
   } else {
       sumSoFar = operand;
   }

   pendingAdditiveOperator = clickedOperator;

   waitingForOperand = true;

}

void Calculator::multiplicativeOperatorClicked() {

   Button *clickedButton = qobject_cast<Button *>(sender());
   QString clickedOperator = clickedButton->text();
   double operand = display->text().toDouble();
   if (!pendingMultiplicativeOperator.isEmpty()) {
       if (!calculate(operand, pendingMultiplicativeOperator)) {
           abortOperation();
     return;
       }
       display->setText(QString::number(factorSoFar));
   } else {
       factorSoFar = operand;
   }
   pendingMultiplicativeOperator = clickedOperator;
   waitingForOperand = true;

}

void Calculator::equalClicked() {

   double operand = display->text().toDouble();
   if (!pendingMultiplicativeOperator.isEmpty()) {
       if (!calculate(operand, pendingMultiplicativeOperator)) {
           abortOperation();
     return;
       }
       operand = factorSoFar;
       factorSoFar = 0.0;
       pendingMultiplicativeOperator.clear();
   }
   if (!pendingAdditiveOperator.isEmpty()) {
       if (!calculate(operand, pendingAdditiveOperator)) {
           abortOperation();
     return;
       }
       pendingAdditiveOperator.clear();
   } else {
       sumSoFar = operand;
   }
   display->setText(QString::number(sumSoFar));
   sumSoFar = 0.0;
   waitingForOperand = true;

}

void Calculator::pointClicked() {

   if (waitingForOperand)
       display->setText("0");
   if (!display->text().contains("."))
       display->setText(display->text() + tr("."));
   waitingForOperand = false;

}

void Calculator::changeSignClicked() {

   QString text = display->text();
   double value = text.toDouble();
   if (value > 0.0) {
       text.prepend(tr("-"));
   } else if (value < 0.0) {
       text.remove(0, 1);
   }
   display->setText(text);

}

void Calculator::backspaceClicked() {

   if (waitingForOperand)
       return;
   QString text = display->text();
   text.chop(1);
   if (text.isEmpty()) {
       text = "0";
       waitingForOperand = true;
   }
   display->setText(text);

}

void Calculator::clear() {

   if (waitingForOperand)
       return;
   display->setText("0");
   waitingForOperand = true;

}

void Calculator::clearAll() {

   sumSoFar = 0.0;
   factorSoFar = 0.0;
   pendingAdditiveOperator.clear();
   pendingMultiplicativeOperator.clear();
   display->setText("0");
   waitingForOperand = true;

}

void Calculator::clearMemory() {

   sumInMemory = 0.0;

} void Calculator::readMemory() {

   display->setText(QString::number(sumInMemory));
   waitingForOperand = true;

} void Calculator::setMemory() {

   equalClicked();
   sumInMemory = display->text().toDouble();

} void Calculator::addToMemory() {

   equalClicked();
   sumInMemory += display->text().toDouble();

}

Button *Calculator::createButton(const QString &text, const char *member) {

   Button *button = new Button(text);
   connect(button, SIGNAL(clicked()), this, member);
   return button;

}

void Calculator::abortOperation() {

   clearAll();
   display->setText(tr("####"));

}

bool Calculator::calculate(double rightOperand, const QString &pendingOperator) {

   if (pendingOperator == tr("+")) {
       sumSoFar += rightOperand;
   } else if (pendingOperator == tr("-")) {
       sumSoFar -= rightOperand;
   } else if (pendingOperator == tr("\327")) {
       factorSoFar *= rightOperand;
   } else if (pendingOperator == tr("\367")) {
 if (rightOperand == 0.0)
     return false;
 factorSoFar /= rightOperand;
   }
   return true;

}


  1. ifndef BUTTON_H
  2. define BUTTON_H
  3. include <QToolButton>

class Button : public QToolButton {

   Q_OBJECT

public:

   Button(const QString &text, QWidget *parent = 0);
   QSize sizeHint() const;

};

  1. endif


  1. include <QtGui>
  2. include "button.h"

Button::Button(const QString &text, QWidget *parent)

   : QToolButton(parent)

{

   setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
   setText(text);

}

QSize Button::sizeHint() const

{

   QSize size = QToolButton::sizeHint();
   size.rheight() += 20;
   size.rwidth() = qMax(size.width(), size.height());
   return size;

}


  1. include <QApplication>
  2. include "calculator.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   Calculator calc;
   calc.show();
   return app.exec();

}


 </source>


Calculator with push buttons

<source lang="cpp"> Foundations of Qt Development\Chapter06\composed\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 "numerickeypad.h"
  3. include <QWidget>
  4. include <QVBoxLayout>
  5. include <QLabel>

int main( int argc, char **argv ) {

 QApplication app( argc, argv );
 
 QWidget widget;
 QVBoxLayout layout( &widget );
 NumericKeypad pad;
 layout.addWidget( &pad );
 QLabel label;
 layout.addWidget( &label );
 
 QObject::connect( &pad, SIGNAL(textChanged(QString)), &label, SLOT(setText(QString)) );
 
 widget.show();
 
 return app.exec();

}

Foundations of Qt Development\Chapter06\composed\numerickeypad.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 <QGridLayout>
  2. include <QLineEdit>
  3. include <QPushButton>
  4. include <QSignalMapper>
  5. include "numerickeypad.h"

NumericKeypad::NumericKeypad( QWidget *parent ) {

 QGridLayout *layout = new QGridLayout( this );
 
 m_lineEdit = new QLineEdit();
 m_lineEdit->setAlignment( Qt::AlignRight );
 
 QPushButton *button0 = new QPushButton( tr("0") );
 QPushButton *button1 = new QPushButton( tr("1") );
 QPushButton *button2 = new QPushButton( tr("2") );
 QPushButton *button3 = new QPushButton( tr("3") );
 QPushButton *button4 = new QPushButton( tr("4") );
 QPushButton *button5 = new QPushButton( tr("5") );
 QPushButton *button6 = new QPushButton( tr("6") );
 QPushButton *button7 = new QPushButton( tr("7") );
 QPushButton *button8 = new QPushButton( tr("8") );
 QPushButton *button9 = new QPushButton( tr("9") );
 QPushButton *buttonDot = new QPushButton( tr(".") );
 QPushButton *buttonClear = new QPushButton( tr("C") );
 
 layout->addWidget( m_lineEdit, 0, 0, 1, 3 );
 
 layout->addWidget( button1, 1, 0 );
 layout->addWidget( button2, 1, 1 );
 layout->addWidget( button3, 1, 2 );
 layout->addWidget( button4, 2, 0 );
 layout->addWidget( button5, 2, 1 );
 layout->addWidget( button6, 2, 2 );
 layout->addWidget( button7, 3, 0 );
 layout->addWidget( button8, 3, 1 );
 layout->addWidget( button9, 3, 2 );
 layout->addWidget( button0, 4, 0 );
 layout->addWidget( buttonDot, 4, 1 );
 layout->addWidget( buttonClear, 4, 2 );
 
 QSignalMapper *mapper = new QSignalMapper( this );
 
 mapper->setMapping( button0, "0" );
 mapper->setMapping( button1, "1" );
 mapper->setMapping( button2, "2" );
 mapper->setMapping( button3, "3" );
 mapper->setMapping( button4, "4" );
 mapper->setMapping( button5, "5" );
 mapper->setMapping( button6, "6" );
 mapper->setMapping( button7, "7" );
 mapper->setMapping( button8, "8" );
 mapper->setMapping( button9, "9" );
 mapper->setMapping( buttonDot, "." );
 
 connect( button0, SIGNAL(clicked()), mapper, SLOT(map()) );
 connect( button1, SIGNAL(clicked()), mapper, SLOT(map()) );
 connect( button2, SIGNAL(clicked()), mapper, SLOT(map()) );
 connect( button3, SIGNAL(clicked()), mapper, SLOT(map()) );
 connect( button4, SIGNAL(clicked()), mapper, SLOT(map()) );
 connect( button5, SIGNAL(clicked()), mapper, SLOT(map()) );
 connect( button6, SIGNAL(clicked()), mapper, SLOT(map()) );
 connect( button7, SIGNAL(clicked()), mapper, SLOT(map()) );
 connect( button8, SIGNAL(clicked()), mapper, SLOT(map()) );
 connect( button9, SIGNAL(clicked()), mapper, SLOT(map()) );
 connect( buttonDot, SIGNAL(clicked()), mapper, SLOT(map()) );
 
 connect( mapper, SIGNAL(mapped(QString)), this, SLOT(buttonClicked(QString)) );
 
 connect( buttonClear, SIGNAL(clicked()), m_lineEdit, SLOT(clear()) );
 connect( m_lineEdit, SIGNAL(textChanged(QString)), this, SLOT(setText(QString)) );

} const QString NumericKeypad::text() const {

 return m_text;

} void NumericKeypad::buttonClicked( const QString &newText ) {

 setText( m_text + newText );

} void NumericKeypad::setText( const QString &newText ) {

 if( newText == m_text )
   return;
   
 m_text = newText;
 m_lineEdit->setText( m_text );
 
 emit textChanged( m_text );

}


Foundations of Qt Development\Chapter06\composed\numerickeypad.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 NUMERICKEYPAD_H
  2. define NUMERICKEYPAD_H
  3. include <QWidget>

class QLineEdit; class NumericKeypad : public QWidget {

 Q_OBJECT
 

public:

 NumericKeypad( QWidget *parent = 0 );
 const QString text() const;

public slots:

 void setText( const QString &text );

signals:

 void textChanged( const QString &text );

private slots:

 void buttonClicked( const QString &text );
 

private:

 QLineEdit *m_lineEdit;
 QString m_text;

};

  1. endif // NUMERICKEYPAD_H


 </source>


Create PushButton and add to window

<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>

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   {
   QWidget *window = new QWidget;
   QPushButton *button1 = new QPushButton("One");
   QPushButton *button2 = new QPushButton("Two");
   QPushButton *button3 = new QPushButton("Three");
   QPushButton *button4 = new QPushButton("Four");
   QPushButton *button5 = new QPushButton("Five");
   QHBoxLayout *layout = new QHBoxLayout;
   layout->addWidget(button1);
   layout->addWidget(button2);
   layout->addWidget(button3);
   layout->addWidget(button4);
   layout->addWidget(button5);
   window->setLayout(layout);
   window->show();
   }
  
   return app.exec();

}


 </source>


extends QPushButton

<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 MyPushButton : public QPushButton { public:

   MyPushButton(QWidget *parent = 0);
   void paintEvent(QPaintEvent *);

}; MyPushButton::MyPushButton(QWidget *parent)

   : QPushButton(parent)

{ }

void MyPushButton::paintEvent(QPaintEvent *) {

   QStyleOptionButton option;
   option.initFrom(this);
   option.state = isDown() ? QStyle::State_Sunken : QStyle::State_Raised;
   if (isDefault())
       option.features |= QStyleOptionButton::DefaultButton;
   option.text = text();
   option.icon = icon();
   QPainter painter(this);
   style()->drawControl(QStyle::CE_PushButton, &option, &painter, this);

}


class MyStyle : public QStyle { public:

   MyStyle();
   void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
                      QPainter *painter, const QWidget *widget);

}; MyStyle::MyStyle() {

   QStyleOptionFrame *option;
   if (const QStyleOptionFrame *frameOption =
          qstyleoption_cast<const QStyleOptionFrame *>(option)) {
       QStyleOptionFrameV2 frameOptionV2(*frameOption);
       // draw the frame using frameOptionV2
   }
   if (const QStyleOptionProgressBar *progressBarOption =
          qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
       QStyleOptionProgressBarV2 progressBarV2(*progressBarOption);
       // draw the progress bar using progressBarV2
   }
   if (const QStyleOptionTab *tabOption =
          qstyleoption_cast<const QStyleOptionTab *>(option)) {
       QStyleOptionTabV2 tabV2(*tabOption);
       // draw the tab using tabV2
  }

}

void MyStyle::drawPrimitive(PrimitiveElement element,

                           const QStyleOption *option,
                           QPainter *painter,
                           const QWidget *widget)

{

   if (element == PE_FrameFocusRect) {
       const QStyleOptionFocusRect *focusRectOption =
               qstyleoption_cast<const QStyleOptionFocusRect *>(option);
       if (focusRectOption) {
           // ...
       }
   }
   // ...

}

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   MyPushButton button;
   button.show();
   return app.exec();

}


 </source>


toggle button demo

<source lang="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 <QPushButton>
  2. include <QHBoxLayout>
  3. include <QMessageBox>
  4. include <QApplication>
  5. include <QDialog>

class QPushButton; class ButtonDialog : public QDialog {

 Q_OBJECT
 

public:

 ButtonDialog( QWidget *parent=0 );
 

private slots:

 void buttonClicked();
 void buttonToggled();
 

private:

 QPushButton *clickButton;
 QPushButton *toggleButton;

}; ButtonDialog::ButtonDialog( QWidget *parent ) : QDialog( parent ) {

 clickButton = new QPushButton( "Click me!", this );
 toggleButton = new QPushButton( "Toggle me!", this );
 toggleButton->setCheckable( true );
 
 QHBoxLayout *layout = new QHBoxLayout( this );
 layout->addWidget( clickButton );
 layout->addWidget( toggleButton );
 
 connect( clickButton, SIGNAL(clicked()), this, SLOT(buttonClicked()) );
 connect( toggleButton, SIGNAL(clicked()), this, SLOT(buttonToggled()) );

} void ButtonDialog::buttonClicked() {

 QMessageBox::information( this, "Clicked!", "The button was clicked!" );

} void ButtonDialog::buttonToggled() {

 QMessageBox::information( this, "Toggled!", QString("The button is %1!").arg(toggleButton->isChecked()?"pressed":"released") );

}

int main( int argc, char **argv ) {

 QApplication app( argc, argv );
 
 ButtonDialog dlg;
 dlg.show();
 
 return app.exec();

}


 </source>