QT 计算器

来源:互联网 发布:淘宝中老年人秧歌服 编辑:程序博客网 时间:2024/05/13 22:20
"caculator.h"#ifndef CALCULATOR_H#define CALCULATOR_H#include <QDialog>QT_BEGIN_NAMESPACEclass QLineEdit;QT_END_NAMESPACEclass Button;//! [0]class Calculator : public QDialog{    Q_OBJECTpublic:    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();//! [0]//! [1]private://! [1] //! [2]    Button *createButton(const QString &text, const char *member);    void abortOperation();    bool calculate(double rightOperand, const QString &pendingOperator);//! [2]//! [3]    double sumInMemory;//! [3] //! [4]    double sumSoFar;//! [4] //! [5]    double factorSoFar;//! [5] //! [6]    QString pendingAdditiveOperator;//! [6] //! [7]    QString pendingMultiplicativeOperator;//! [7] //! [8]    bool waitingForOperand;//! [8]//! [9]    QLineEdit *display;//! [9] //! [10]    enum { NumDigitButtons = 10 };    Button *digitButtons[NumDigitButtons];};//! [10]#endif


"button.h"#ifndef BUTTON_H#define BUTTON_H#include <QToolButton>//! [0]class Button : public QToolButton{    Q_OBJECTpublic:    Button(const QString &text, QWidget *parent = 0);    QSize sizeHint() const;};//! [0]#endif
"button.cpp"#include <QtGui> #include "button.h"//! [0]Button::Button(const QString &text, QWidget *parent)    : QToolButton(parent){    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);    setText(text);}//! [0]//! [1]QSize Button::sizeHint() const//! [1] //! [2]{    QSize size = QToolButton::sizeHint();    size.rheight() += 20;    size.rwidth() = qMax(size.width(), size.height());    return size;}//! [2]
"caculator.cpp"#include <QtGui>#include <math.h>#include "button.h"#include "calculator.h"//! [0]Calculator::Calculator(QWidget *parent)    : QDialog(parent){    sumInMemory = 0.0;    sumSoFar = 0.0;    factorSoFar = 0.0;    waitingForOperand = true;//! [0]//! [1]    display = new QLineEdit("0");//! [1] //! [2]    display->setReadOnly(true);    display->setAlignment(Qt::AlignRight);    display->setMaxLength(15);    QFont font = display->font();    font.setPointSize(font.pointSize() + 8);    display->setFont(font);//! [2]//! [4]    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()));//! [4]//! [5]    QGridLayout *mainLayout = new QGridLayout;//! [5] //! [6]    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"));}//! [6]//! [7]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));}//! [7]//! [8]void Calculator::unaryOperatorClicked()//! [8] //! [9]{    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;}//! [9]//! [10]void Calculator::additiveOperatorClicked()//! [10] //! [11]{    Button *clickedButton = qobject_cast<Button *>(sender());    QString clickedOperator = clickedButton->text();    double operand = display->text().toDouble();//! [11] //! [12]    if (!pendingMultiplicativeOperator.isEmpty()) {//! [12] //! [13]        if (!calculate(operand, pendingMultiplicativeOperator)) {            abortOperation();    return;        }        display->setText(QString::number(factorSoFar));        operand = factorSoFar;        factorSoFar = 0.0;        pendingMultiplicativeOperator.clear();    }//! [13] //! [14]    if (!pendingAdditiveOperator.isEmpty()) {//! [14] //! [15]        if (!calculate(operand, pendingAdditiveOperator)) {            abortOperation();    return;        }        display->setText(QString::number(sumSoFar));    } else {        sumSoFar = operand;    }//! [15] //! [16]    pendingAdditiveOperator = clickedOperator;//! [16] //! [17]    waitingForOperand = true;}//! [17]//! [18]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;}//! [18]//! [20]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;}//! [20]//! [22]void Calculator::pointClicked(){    if (waitingForOperand)        display->setText("0");    if (!display->text().contains("."))        display->setText(display->text() + tr("."));    waitingForOperand = false;}//! [22]//! [24]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);}//! [24]//! [26]void Calculator::backspaceClicked(){    if (waitingForOperand)        return;    QString text = display->text();    text.chop(1);    if (text.isEmpty()) {        text = "0";        waitingForOperand = true;    }    display->setText(text);}//! [26]//! [28]void Calculator::clear(){    if (waitingForOperand)        return;    display->setText("0");    waitingForOperand = true;}//! [28]//! [30]void Calculator::clearAll(){    sumSoFar = 0.0;    factorSoFar = 0.0;    pendingAdditiveOperator.clear();    pendingMultiplicativeOperator.clear();    display->setText("0");    waitingForOperand = true;}//! [30]//! [32]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();}//! [32]//! [34]Button *Calculator::createButton(const QString &text, const char *member){    Button *button = new Button(text);    connect(button, SIGNAL(clicked()), this, member);    return button;}//! [34]//! [36]void Calculator::abortOperation(){    clearAll();    display->setText(tr("####"));}//! [36]//! [38]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;}//! [38]


 

"main.cpp"#include <QApplication>#include "calculator.h"int main(int argc, char *argv[]){    QApplication app(argc, argv);    Calculator calc;    calc.show();    return app.exec();}




 

原创粉丝点击