Qt编写简单计算器

一、使用LCD Number、Push Button和GridLayout编辑计算器页面。

 二、代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
//使用枚举表示运算类型
enum oper
{
    oper_add,
    oper_sub,
    oper_mul,
    oper_div,


};

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_1_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_add_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

    void on_pushButton_sub_clicked();

    void on_pushButton_7_clicked();

    void on_pushButton_8_clicked();

    void on_pushButton_9_clicked();

    void on_pushButton_mul_clicked();

    void on_pushButton_0_clicked();

    void on_pushButton_equ_clicked();

    void on_pushButton_div_clicked();

    void on_pushButton_clear_clicked();

private:
    Ui::Widget *ui;
    //记录当前值
    int num;
    //上一个操作数
    int temp;
    //记录当前运算
    oper op;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //初始化
    num = 0;
    temp = 0;
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_1_clicked()
{

    num = num*10+1;
//显示
    ui->lcdNumber->display(num);

}

void Widget::on_pushButton_2_clicked()
{
    num = num*10+2;
    //显示
    ui->lcdNumber->display(num);

}

void Widget::on_pushButton_3_clicked()
{
    num = num*10+3;
//显示
    ui->lcdNumber->display(num);
}

void Widget::on_pushButton_4_clicked()
{
    num = num*10+4;
//显示
    ui->lcdNumber->display(num);
}

void Widget::on_pushButton_5_clicked()
{
    num = num*10+5;
//显示
    ui->lcdNumber->display(num);
}

void Widget::on_pushButton_6_clicked()
{
    num = num*10+6;
//显示
    ui->lcdNumber->display(num);
}


void Widget::on_pushButton_7_clicked()
{
    num = num*10+7;
//显示
    ui->lcdNumber->display(num);
}

void Widget::on_pushButton_8_clicked()
{
    num = num*10+8;
//显示
    ui->lcdNumber->display(num);
}

void Widget::on_pushButton_9_clicked()
{
    num = num*10+9;
//显示
    ui->lcdNumber->display(num);
}

void Widget::on_pushButton_0_clicked()
{
    num = num*10;
//显示
    ui->lcdNumber->display(num);
}

void Widget::on_pushButton_add_clicked()
{
    if(temp>0)
    {
        on_pushButton_clear_clicked();
    }
    op = oper_add;
    temp = num;
    num = 0;
}

void Widget::on_pushButton_sub_clicked()
{
    if(temp>0)
    {
        on_pushButton_clear_clicked();
    }
    op = oper_sub;
    temp = num;
    num = 0;
}

void Widget::on_pushButton_mul_clicked()
{
    if(temp>0)
    {
        on_pushButton_clear_clicked();
    }
    op = oper_mul;
    temp = num;
    num = 0;
}

void Widget::on_pushButton_div_clicked()
{
    if(temp>0)
    {
        on_pushButton_clear_clicked();
    }
    op = oper_div;
    temp = num;
    num = 0;
}

void Widget::on_pushButton_equ_clicked()
{
    switch (op) {
    case oper_add:
        num = temp+num;
        break;
    case oper_sub:
        num = temp-num;
        break;
    case oper_mul:
        num = temp*num;
        break;
    case oper_div:
        if(num == 0)
        {
            num = 0;
            temp = 0;
            ui->lcdNumber->display("Err");
            return;
        }
        num = temp/num;
        break;
    }
    temp = 0;
    ui->lcdNumber->display(num);

}



void Widget::on_pushButton_clear_clicked()
{
    num = 0;
    temp = 0;
    ui->lcdNumber->display(num);
}

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的 Qt 计算器的代码示例: ``` #include <QtWidgets> class Calculator : public QWidget { 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(); private: void abortOperation(); bool calculate(double rightOperand, const QString &pendingOperator); QDoubleSpinBox *display; QString pendingAdditiveOperator; QString pendingMultiplicativeOperator; QString pendingUnaryOperator; double factorSoFar; bool waitingForOperand; bool operandClicked; }; Calculator::Calculator(QWidget *parent) : QWidget(parent), pendingAdditiveOperator(""), pendingMultiplicativeOperator(""), pendingUnaryOperator(""), factorSoFar(0.0), waitingForOperand(true), operandClicked(false) { display = new QDoubleSpinBox(); display->setRange(-999999999.0, 999999999.0); display->setDecimals(10); display->setSingleStep(0.1); display->setReadOnly(true); 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 *pointButton = new QPushButton(tr(".")); QPushButton *changeSignButton = new QPushButton(tr("\302\261")); QPushButton *backspaceButton = new QPushButton(tr("Backspace")); QPushButton *clearButton = new QPushButton(tr("Clear")); QPushButton *clearAllButton = new QPushButton(tr("Clear All")); QPushButton *divisionButton = new QPushButton(tr("\303\267")); QPushButton *timesButton = new QPushButton(tr("\303\227")); QPushButton *minusButton = new QPushButton(tr("-")); QPushButton *plusButton = new QPushButton(tr("+")); QPushButton *equalButton = new QPushButton(tr("=")); QGridLayout *mainLayout = new QGridLayout; mainLayout->setSizeConstraint(QLayout::SetFixedSize); mainLayout->addWidget(display, 0, 0, 1, 4); mainLayout->addWidget(button1, 1, 0); mainLayout->addWidget(button2, 1, 1); mainLayout->addWidget(button3, 1, 2); mainLayout->addWidget(divisionButton, 1, 3); mainLayout->addWidget(button4, 2, 0); mainLayout->addWidget(button5, 2, 1); mainLayout->addWidget(button6, 2, 2); mainLayout->addWidget(timesButton, 2, 3); mainLayout->addWidget(button7, 3, 0); mainLayout->addWidget(button8, 3, 1); mainLayout->addWidget(button9, 3, 2); mainLayout->addWidget(minusButton, 3, 3); mainLayout->addWidget(button0, 4, 0); mainLayout->addWidget(pointButton, 4, 1); mainLayout->addWidget(changeSignButton, 4, 2); mainLayout->addWidget(plusButton, 4, 3); mainLayout->addWidget(backspaceButton, 5, 0, 1, 2); mainLayout->addWidget(clearButton, 5, 2, 1, 1); mainLayout->addWidget(clearAllButton, 5, 3, 1, 1); mainLayout->addWidget(equalButton, 6, 3); setLayout(mainLayout); connect(button0, SIGNAL(clicked()), this, SLOT(digitClicked())); connect(button1, SIGNAL(clicked()), this, SLOT(digitClicked())); connect(button2, SIGNAL(clicked()), this, SLOT(digitClicked())); connect(button3, SIGNAL(clicked()), this, SLOT(digitClicked())); connect(button4, SIGNAL(clicked()), this, SLOT(digitClicked())); connect(button5, SIGNAL(clicked()), this, SLOT(digitClicked())); connect(button6, SIGNAL(clicked()), this, SLOT(digitClicked())); connect(button7, SIGNAL(clicked()), this, SLOT(digitClicked())); connect(button8, SIGNAL(clicked()), this, SLOT(digitClicked())); connect(button9, SIGNAL(clicked()), this, SLOT(digitClicked())); connect(pointButton, SIGNAL(clicked()), this, SLOT(pointClicked())); connect(changeSignButton, SIGNAL(clicked()), this, SLOT(changeSignClicked())); connect(backspaceButton, SIGNAL(clicked()), this, SLOT(backspaceClicked())); connect(clearButton, SIGNAL(clicked()), this, SLOT(clear())); connect(clearAllButton, SIGNAL(clicked()), this, SLOT(clearAll())); connect(divisionButton, SIGNAL(clicked()), this, SLOT(multiplicativeOperatorClicked())); connect(timesButton, SIGNAL(clicked()), this, SLOT(multiplicativeOperatorClicked())); connect(minusButton, SIGNAL(clicked()), this, SLOT(additiveOperatorClicked())); connect(plusButton, SIGNAL(clicked()), this, SLOT(additiveOperatorClicked())); connect(equalButton, SIGNAL(clicked()), this, SLOT(equalClicked())); } void Calculator::digitClicked() { QPushButton *clickedButton = qobject_cast<QPushButton *>(sender()); int digitValue = clickedButton->text().toInt(); if (display->value() == 0.0 && !waitingForOperand) { display->setValue(digitValue); waitingForOperand = true; } else { display->setValue(display->value() * 10 + digitValue); } } void Calculator::unaryOperatorClicked() { QPushButton *clickedButton = qobject_cast<QPushButton *>(sender()); QString clickedOperator = clickedButton->text(); double operand = display->value(); if (clickedOperator == tr("Sqrt")) { if (operand < 0.0) { abortOperation(); return; } operand = std::sqrt(operand); } display->setValue(operand); waitingForOperand = true; operandClicked = true; } void Calculator::additiveOperatorClicked() { QPushButton *clickedButton = qobject_cast<QPushButton *>(sender()); QString clickedOperator = clickedButton->text(); double operand = display->value(); if (!pendingMultiplicativeOperator.isEmpty()) { if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation(); return; } operand = factorSoFar; factorSoFar = 0.0; pendingMultiplicativeOperator = ""; } if (!pendingAdditiveOperator.isEmpty()) { if (!calculate(operand, pendingAdditiveOperator)) { abortOperation(); return; } display->setValue(factorSoFar); } else { factorSoFar = operand; } pendingAdditiveOperator = clickedOperator; waitingForOperand = true; operandClicked = true; } void Calculator::multiplicativeOperatorClicked() { QPushButton *clickedButton = qobject_cast<QPushButton *>(sender()); QString clickedOperator = clickedButton->text(); double operand = display->value(); if (!pendingMultiplicativeOperator.isEmpty()) { if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation(); return; } operand = factorSoFar; factorSoFar = 0.0; } if (!pendingAdditiveOperator.isEmpty()) { if (!calculate(operand, pendingAdditiveOperator)) { abortOperation(); return; } display->setValue(factorSoFar); } else { factorSoFar = operand; } pendingMultiplicativeOperator = clickedOperator; waitingForOperand = true; operandClicked = true; } bool Calculator::calculate(double rightOperand, const QString &pendingOperator) { if (pendingOperator == tr("+")) { factorSoFar += rightOperand; } else if (pendingOperator == tr("-")) { factorSoFar -= rightOperand; } else if (pendingOperator == tr("\303\227")) { factorSoFar *= rightOperand; } else if (pendingOperator == tr("\303\267")) { if (rightOperand == 0.0) { return false; } factorSoFar /= rightOperand; } return true; } void Calculator::equalClicked() { double operand = display->value(); if (!pendingMultiplicativeOperator.isEmpty()) { if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation(); return; } operand = factorSoFar; factorSoFar = 0.0; pendingMultiplicativeOperator = ""; } if (!pendingAdditiveOperator.isEmpty()) { if (!calculate(operand, pendingAdditiveOperator)) { abortOperation(); return; } pendingAdditiveOperator = ""; } else { factorSoFar = operand; } display->setValue(factorSoFar); factorSoFar = 0.0; waitingForOperand = true; operandClicked = true; } void Calculator::pointClicked() { if (!waitingForOperand) { display->setValue(display->value() + "."); waitingForOperand = true; } } void Calculator::changeSignClicked() { display->setValue(display->value() * -1); } void Calculator::backspaceClicked() { if (waitingForOperand) { return; } QString text = QString::number(display->value()); text.chop(1); if (text.isEmpty() || text == "-") { text = "0"; } display->setValue(text.toDouble()); } void Calculator::clear() { if (waitingForOperand) { return; } display->setValue(0.0); waitingForOperand = true; } void Calculator::clearAll() { display->setValue(0.0); pendingAdditiveOperator = ""; pendingMultiplicativeOperator = ""; pendingUnaryOperator = ""; factorSoFar = 0.0; waitingForOperand = true; } void Calculator::abortOperation() { clearAll(); display->setText(tr("####")); } int main(int argc, char *argv[]) { QApplication app(argc, argv); Calculator calc; calc.show(); return app.exec(); } ``` 这里使用了 QGridLayout 来布局界面,使用 QDoubleSpinBox 来显示计算结果。各个按钮的点击事件被连接到了相应的槽函数,实现了计算器的基本功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值