Qt开发——计算器制作

7 篇文章 1 订阅

在写文章之前,我想先建议大家在做任何项目的时候,都需要做好草稿,不用写太多的代码,只是建议走一下流程,把思路逻辑与实现方法理清楚。
因为刚开始的时候,我觉得计算器应该很简单,而且之前学C++基础的时候有在控制台上实现过计算器的功能,所以并没有打草稿。后来发现真的错了,因为有很多内容还是要一步一步实现的,例如除数等于0的时候,程序会崩溃,两次同时按下“+”,会发生什么,等等等等,以至于我的逻辑最后越来越乱,只能重新理一遍思路,再把要实现的内容实现完。

废话不多说,先进入项目吧。这次的计算器还是算比较简易的,只实现了整数的加减乘除(这里的除是取整),并没有小数的加入

第一步:
新建项目,基类为QWidget,选择带ui界面

第二步:
界面ui设计,使用ui设计师模式,通过改变样式表,与改变参数与按钮名称,结果如图所示
在这里插入图片描述
第三步:
将相应按钮通过转到槽,设置函数

第四步:
在主函数里面声明变量

private:
    Ui::Widget *ui;
    int num1,num2,result;//储存第一个数、第二个数、结果
    bool isNum1;//判断输入的是第一个数还是第二个数
    int opetrat;//储存四个运算符
    QString str;//lineEdit显示的内容
    bool isContinue;//判断一次结束后是否继续
    bool opetratHasClicked;//判断运算符是否按下过一次

然后在构造函数中初始化

 ui->setupUi(this);
    num1=0;
    num2=0;
    result=0;
    isNum1=true;
    opetrat=0;
    isContinue=false;
    opetratHasClicked=false;
    str="";

按钮0~9与加减乘除原理都一样,所以我只说明一个

按键1的实现:

void Widget::on_btn_1_clicked()
{

    if(isContinue){//判断一次运算之后是否继续进行,不是的话,直接计算下一个数,是的话,计算第二个数
        num1=1;
        str="1";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;
    }
    else
    {
        if(isNum1){
            num1=num1*10+1;
        }else {
            num2=num2*10+1;
        }
        str+="1";
        ui->lineEdit->setText(str);
    }

}

“+“键的实现:

void Widget::on_btn_add_clicked()
{
    if(isContinue){num1=result;isContinue=false;}//判断一次计算后是否继续
    opetrat=1;

    if(opetratHasClicked&&opetrat!=1){//防止一次计算中按下两次运算符
        str=str.left(str.size()-1);
        str+="+";
        ui->lineEdit->setText(str);
        isNum1=false;
        opetratHasClicked=true;
    }else if(opetratHasClicked) {
        isNum1=false;
        opetratHasClicked=true;
    }else {
        if(str==""){}
        else
        {
        str+="+";
        ui->lineEdit->setText(str);
        isNum1=false;
        opetratHasClicked=true;
        }

    }
}

“=“号键的实现:


void Widget::on_btn_equal_clicked()
{
    if(opetratHasClicked)
    {
        switch(opetrat){//判断加减乘除符号
        case 1:
            result=num1+num2;
            str.setNum(result);
            ui->lineEdit->setText(str);
            break;

        case 2:
            result=num1-num2;
            str.setNum(result);
            ui->lineEdit->setText(str);
            break;
        case 3:
            result=num1*num2;
            str.setNum(result);
            ui->lineEdit->setText(str);
            break;
        case 4:
            if(num2==0){//防止除数为0
                str.clear();
                ui->lineEdit->clear();
                break;
            }
            else{
                result=num1/num2;
                str.setNum(result);
                ui->lineEdit->setText(str);
                break;
            }
        }


        isContinue=true;
        isNum1=false;
        num2=0;
        opetratHasClicked=false;
    }

重置键的实现

void Widget::on_btn_del_clicked()
{
    //只需把参数还原成构造函数中的参数,屏幕清空
    num1=0;
    num2=0;
    result=0;
    isNum1=true;
    opetrat=0;
    isContinue=false;
    opetratHasClicked=false;

    str="";
    ui->lineEdit->clear();
}

第五步:
改变ico,打包,运行结果如图所示

在这里插入图片描述

代码源文件如下
.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_btn_1_clicked();

    void on_btn_2_clicked();

    void on_btn_add_clicked();

    void on_btn_equal_clicked();

    void on_btn_minus_clicked();

    void on_btn_del_clicked();

    void on_btn_3_clicked();

    void on_btn_0_clicked();

    void on_btn_4_clicked();

    void on_btn_5_clicked();

    void on_btn_6_clicked();

    void on_btn_7_clicked();

    void on_btn_9_clicked();

    void on_btn_8_clicked();

    void on_btn_mul_clicked();

    void on_btn_div_clicked();

private:
    Ui::Widget *ui;
    int num1,num2,result;//储存第一个数、第二个数、结果
    bool isNum1;//判断输入的是第一个数还是第二个数
    int opetrat;//储存四个运算符
    QString str;//lineEdit显示的内容
    bool isContinue;//判断一次结束后是否继续
    bool opetratHasClicked;//判断运算符是否按下过一次
};

#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QString>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    num1=0;
    num2=0;
    result=0;
    isNum1=true;
    opetrat=0;
    isContinue=false;
    opetratHasClicked=false;
    str="";
}

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

void Widget::on_btn_1_clicked()
{

    if(isContinue){//判断一次运算之后是否继续进行,不是的话,直接计算下一个数,是的话,计算第二个数
        num1=1;
        str="1";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;
    }
    else
    {
        if(isNum1){
            num1=num1*10+1;
        }else {
            num2=num2*10+1;
        }
        str+="1";
        ui->lineEdit->setText(str);
    }

}

void Widget::on_btn_2_clicked()
{

    if(isContinue){
        num1=2;
        str="2";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;

    }
    else
    {
        if(isNum1){
            num1=num1*10+2;
        }else {
            num2=num2*10+2;
        }
        str+="2";
        ui->lineEdit->setText(str);
    }

}


void Widget::on_btn_add_clicked()
{
    if(isContinue){num1=result;isContinue=false;}//判断一次计算后是否继续
    opetrat=1;

    if(opetratHasClicked&&opetrat!=1){//防止一次计算中按下两次运算符
        str=str.left(str.size()-1);
        str+="+";
        ui->lineEdit->setText(str);
        isNum1=false;
        opetratHasClicked=true;
    }else if(opetratHasClicked) {
        isNum1=false;
        opetratHasClicked=true;
    }else {
        if(str==""){}
        else
        {
        str+="+";
        ui->lineEdit->setText(str);
        isNum1=false;
        opetratHasClicked=true;
        }

    }
}

void Widget::on_btn_minus_clicked()
{
    if(isContinue){num1=result;isContinue=false;}
    opetrat=2;

    if(opetratHasClicked&&opetrat!=2){
        str=str.left(str.size()-1);
        str+="-";
        ui->lineEdit->setText(str);
        isNum1=false;
        opetratHasClicked=true;
    }else if(opetratHasClicked) {
        isNum1=false;
        opetratHasClicked=true;
    }else {
        if(str==""){}
        else
        {
        str+="-";
        ui->lineEdit->setText(str);
        isNum1=false;
        opetratHasClicked=true;
        }

    }


}

void Widget::on_btn_equal_clicked()
{
    if(opetratHasClicked)
    {
        switch(opetrat){//判断加减乘除符号
        case 1:
            result=num1+num2;
            str.setNum(result);
            ui->lineEdit->setText(str);
            break;

        case 2:
            result=num1-num2;
            str.setNum(result);
            ui->lineEdit->setText(str);
            break;
        case 3:
            result=num1*num2;
            str.setNum(result);
            ui->lineEdit->setText(str);
            break;
        case 4:
            if(num2==0){//防止除数为0
                str.clear();
                ui->lineEdit->clear();
                break;
            }
            else{
                result=num1/num2;
                str.setNum(result);
                ui->lineEdit->setText(str);
                break;
            }
        }


        isContinue=true;
        isNum1=false;
        num2=0;
        opetratHasClicked=false;
    }

}

void Widget::on_btn_del_clicked()
{
    //只需把参数还原成构造函数中的参数,屏幕清空
    num1=0;
    num2=0;
    result=0;
    isNum1=true;
    opetrat=0;
    isContinue=false;
    opetratHasClicked=false;

    str="";
    ui->lineEdit->clear();
}

void Widget::on_btn_3_clicked()
{
    if(isContinue){
        num1=3;
        str="3";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;

    }
    else
    {
        if(isNum1){
            num1=num1*10+3;
        }else {
            num2=num2*10+3;
        }
        str+="3";
        ui->lineEdit->setText(str);
    }

}

void Widget::on_btn_0_clicked()
{
    if(isContinue){
        num1=0;
        str="0";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;

    }
    else
    {
        if(isNum1){
            num1=num1*10+0;
        }else {
            num2=num2*10+0;
        }
        str+="0";
        ui->lineEdit->setText(str);
    }

}

void Widget::on_btn_4_clicked()
{
    if(isContinue){
        num1=4;
        str="4";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;

    }
    else
    {
        if(isNum1){
            num1=num1*10+4;
        }else {
            num2=num2*10+4;
        }
        str+="4";
        ui->lineEdit->setText(str);
    }

}

void Widget::on_btn_5_clicked()
{
    if(isContinue){
        num1=5;
        str="5";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;

    }
    else
    {
        if(isNum1){
            num1=num1*10+5;
        }else {
            num2=num2*10+5;
        }
        str+="5";
        ui->lineEdit->setText(str);
    }
}

void Widget::on_btn_6_clicked()
{
    if(isContinue){
        num1=6;
        str="6";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;

    }
    else
    {
        if(isNum1){
            num1=num1*10+6;
        }else {
            num2=num2*10+6;
        }
        str+="6";
        ui->lineEdit->setText(str);
    }
}

void Widget::on_btn_7_clicked()
{
    if(isContinue){
        num1=7;
        str="7";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;

    }
    else
    {
        if(isNum1){
            num1=num1*10+7;
        }else {
            num2=num2*10+7;
        }
        str+="7";
        ui->lineEdit->setText(str);
    }
}

void Widget::on_btn_9_clicked()
{
    if(isContinue){
        num1=9;
        str="9";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;

    }
    else
    {
        if(isNum1){
            num1=num1*10+9;
        }else {
            num2=num2*10+9;
        }
        str+="9";
        ui->lineEdit->setText(str);
    }
}

void Widget::on_btn_8_clicked()
{
    if(isContinue){
        num1=8;
        str="8";
        ui->lineEdit->setText(str);
        isContinue=false;
        isNum1=true;

    }
    else
    {
        if(isNum1){
            num1=num1*10+8;
        }else {
            num2=num2*10+8;
        }
        str+="8";
        ui->lineEdit->setText(str);

    }
}

void Widget::on_btn_mul_clicked()
{
    if(isContinue){num1=result;isContinue=false;}
    opetrat=3;

    if(opetratHasClicked&&opetrat!=3){
        str=str.left(str.size()-1);
        str+="*";
        ui->lineEdit->setText(str);
        isNum1=false;
        opetratHasClicked=true;
    }else if(opetratHasClicked) {
        isNum1=false;
        opetratHasClicked=true;
    }else {
        if(str==""){}
        else
        {
        str+="*";
        ui->lineEdit->setText(str);
        isNum1=false;
        opetratHasClicked=true;
        }

    }



}

void Widget::on_btn_div_clicked()
{
    if(isContinue){num1=result;isContinue=false;}
    opetrat=4;

    if(opetratHasClicked&&opetrat!=4){
        str=str.left(str.size()-1);
        str+="÷";
        ui->lineEdit->setText(str);
        isNum1=false;
        opetratHasClicked=true;
    }else if(opetratHasClicked) {
        isNum1=false;
        opetratHasClicked=true;
    }else {
        if(str==""){}
        else
        {
        str+="÷";
        ui->lineEdit->setText(str);
        isNum1=false;
        opetratHasClicked=true;
        }
    }


}

main文件不变

谢谢大家的支持,有什么不足希望指出,一起学习,一起进步

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值