QT C++实现简单计算器(仿windows计算器普通模式)

这篇博客详细记录了使用QT C++实现一个仿Windows计算器的过程,包括UI设计和四则运算逻辑。博主强调在实现过程中遇到的困难,如网上资源稀缺,以及一些未实现的功能,如错误检查和大数值处理。代码分别包含calculator.h、calculator.cpp、main.cpp和calculator.ui四个部分。
摘要由CSDN通过智能技术生成

写的过程很痛,网上找不到相关的详细的分析,所以想着发一个吧。


版本看自己喜好了,我的是5.4.2。



类名首字母大写。



//calculator.h

#ifndef CALCULATOR_H
#define CALCULATOR_H
#include <QMainWindow>
namespace Ui {
class Calculator;
}
class Calculator : public QMainWindow
{
    Q_OBJECT
public:
    explicit Calculator(QWidget *parent = 0);
    ~Calculator();
    enum FLAG_OPERATOR{
        FLAG_OPERATOR_NONE = 0,
        FLAG_OPERATOR_ADD,
        FLAG_OPERATOR_SUB,
        FLAG_OPERATOR_MUL,
        FLAG_OPERATOR_DIV
    };
private slots:
    void on_tb_num0_clicked();
    void on_tb_num1_clicked();
    void on_tb_num2_clicked();
    void on_tb_num3_clicked();
    void on_tb_num4_clicked();
    void on_tb_num5_clicked();
    void on_tb_num6_clicked();
    void on_tb_num7_clicked();
    void on_tb_num8_clicked();
    void on_tb_num9_clicked();
    void on_tb_add_clicked();
    void on_tb_equ_clicked();
    void on_tb_mul_clicked();
    void on_tb_clear_clicked();
    void on_tb_div_clicked();
    void on_tb_sub_clicked();
private:
    Ui::Calculator *ui;
    void clickedNumber(const QString &t);
    void middleResult(void);
    void model();
    bool m_firstOperator;
    QString m_value;
    QString m_leftValue;
    QString m_rightValue;
    FLAG_OPERATOR m_operator;
    QString m_expretion;
    QString m_result;
    int m_model;
};
#endif // CALCULATOR_H

其中用宏代替了“   + - x  /  ” 槽有0~9和“+ - x / ”    

//calculator.cpp

#include "calculator.h"
#include "ui_calculator.h"
Calculator::Calculator(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Calculator)
{
    ui->setupUi(this);
    on_tb_clear_clicked();
    m_model = 0;
}
Calculator::~Calculator()
{
    delete ui;
}
void Calculator::on_tb_num0_clicked()
{
    clickedNumber(ui->tb_num0->text());
}
void Calculator::on_tb_num1_clicked()
{
    clickedNumber(ui->tb_num1->text());
}
void Calculator::on_tb_num2_clicked()
{
    clickedNumber(ui->tb_num2->text());
}
void Calculator::on_tb_num3_clicked()
{
    clickedNumber(ui->tb_num3->text());
}
void Calculator::on_tb_num4_clicked()
{
    clickedNumber(ui->tb_num4->text());
}
void Calculator::on_tb_num5_clicked()
{
    clickedNumber(ui->tb_num5->text());
}
void Calculator::on_tb_num6_clicked()
{
    clickedNumber(ui->tb_num6->text());
}
void Calculator::on_tb_num7_clicked()
{
    clickedNumber(ui->tb_num7->text());
}
void Calculator::on_tb_num8_clicked()
{
    clickedNumber(ui->tb_num8->text());
}
void Calculator::on_tb_num9_clicked()
{
    clickedNumber(ui->tb_num9->text());
}
void Calculator::clickedNumber(const QString &t)
{
    m_value += t;
    m_expretion += t;
    ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_add_clicked()
{
    middleResult();
    m_operator = FLAG_OPERATOR_ADD;
    m_expretion += ui->tb_add->text();
    ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_mul_clicked()
{
    middleResult();
    m_operator = FLAG_OPERATOR_MUL;
    m_expretion += ui->tb_mul->text();
    ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_div_clicked()
{
    middleResult();
    m_operator = FLAG_OPERATOR_DIV;
    m_expretion += ui->tb_div->text();
    ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_sub_clicked()
{
    middleResult();
    m_operator = FLAG_OPERATOR_SUB;
    m_expretion += ui->tb_sub->text();
    ui->lb_expretion->setText(m_expretion);
}
void Calculator::middleResult()
{
    if(m_firstOperator)
    {
        m_firstOperator = false;
        m_leftValue = m_value;
        m_value.clear();
    }else
    {
        m_rightValue = m_value;
        m_value.clear();
        switch (m_operator) {
        case FLAG_OPERATOR_ADD:
            m_leftValue = QString::number(m_leftValue.toInt() + m_rightValue.toInt());
            on_tb_equ_clicked();
            break;
        case FLAG_OPERATOR_SUB:
            m_leftValue = QString::number(m_leftValue.toInt() - m_rightValue.toInt());
            on_tb_equ_clicked();
            break;
        case FLAG_OPERATOR_MUL:
            m_leftValue = QString::number(m_leftValue.toInt() * m_rightValue.toInt());
            on_tb_equ_clicked();
            break;
        case FLAG_OPERATOR_DIV:
            if(m_rightValue == "0")
            {
                Calculator::on_tb_clear_clicked();
                ui->lb_result->setText("除数不能为0");
            }
            else
            {
                m_leftValue = QString::number(m_leftValue.toInt() / m_rightValue.toInt());
                on_tb_equ_clicked();
            }
            break;
        default:
            break;
        }
    }
}
void Calculator::on_tb_equ_clicked()
{
    m_rightValue = m_value;
    m_value.clear();
    switch (m_operator) {
    case FLAG_OPERATOR_ADD:
        m_result = QString::number(m_leftValue.toInt() + m_rightValue.toInt());
        break;
    case FLAG_OPERATOR_MUL:
        m_result = QString::number(m_leftValue.toInt() * m_rightValue.toInt());
        break;
    case FLAG_OPERATOR_DIV:
        m_result = QString::number(m_leftValue.toInt() / m_rightValue.toInt());
        break;
    case FLAG_OPERATOR_SUB:
        m_result = QString::number(m_leftValue.toInt() - m_rightValue.toInt());
        break;
    default:
        break;
    }
    ui->lb_result->setText(m_result);
}
void Calculator::on_tb_clear_clicked()
{
    m_firstOperator = true;
    m_operator = FLAG_OPERATOR_NONE;
    m_value.clear();
    m_expretion.clear();
    m_result.clear();
    m_leftValue.clear();
    m_rightValue.clear();
    ui->lb_expretion->setText("0");
    ui->lb_result->setText("0");
}

 
 
 
 

四则运算部分:将运算部分封装到了on_tb_equ_clicked()即“=”的槽中(偷个懒~~~),on_tb_clear_clicked()函数实现运算符左,右值的清除和两个显示

窗口的内容清除。

错误报告部分:除数不能为0

case FLAG_OPERATOR_DIV:
            if(m_rightValue == "0")
            {
                Calculator::on_tb_clear_clicked();
                ui->lb_result->setText("除数不能为0");
            }
            else
            {
                m_leftValue = QString::number(m_leftValue.toInt() / m_rightValue.toInt());
                on_tb_equ_clicked();
            }
            break;

还有一些儿我没写(偷懒)比如:连续输入运算符错误;结果的数值过大无法正常显示;


//main.cpp

#include "calculator.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Calculator w;
    w.show();
    return a.exec();
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值