基于C++的Qt计算器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

        本文是基于C++开发Qt计算器,实现功能有利用鼠标按下数字和运算符实现加减乘除基本运算(+-*/)、Clear清零按键功能实现和退格功能。本例还可以利用数字键盘对数字、加减乘除运算符和清除退格进行交互。但是在每次使用键盘前,建议先用鼠标点击一次=运算符,否则会出现无法计算的error。       

        在我看来计算器实现思路大概有两种。第一种较为复杂,我尝试了一天时间,最终还是放弃了,不过可以提供一个思路。(较为复杂,此处可以略,新手建议直接跳到第二种方法。也就是本文所做计算器的方法)

        第一种方法:运行思路为,每次输入数字或运算符(简称op)时,都用QString类型字符串进行储存。(如果第一次输入是op,用if判断使其不进入QString存储)最终按下=,依次拆开数字和op进行存储,可能会使用到struct构造。再考虑到运算优先级对QString字符串拆分运算,输出结果。

       第二种方法:如果第一次输入运算符时,对话框不显示。如果第一次输入数字时会将数字保存在浮点类型的num1中,再利用expression=QString("%1").arg (num1);语句,将浮点型num1转化并保存在QString类型的expression中,并在对话框显示。然后输入运算符,如果该数字是第一次输入,会先将num1放入浮点型的result中,并显示;如果该数字非第一次输入,则按下运算符会直接进行计算,然后显示。最终按下=符号即可得最终结果。                                                                


提示:以下是本篇文章正文内容,下面案例可供参考

一、pandas是什么?

        设计界面如下:其中退格按键的图标打不出来,可以插入图片,用ps去掉白边,这样效果好点。

        设置文本框字体和显示大小方式如下:

        设置按键快捷键方式如下:

点开后直接点击键盘对应按键即可。

二、使用步骤

1.引入widget.h文件

代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QStack>
#include <QString>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    
private slots:  
    void on_oneButton_clicked();
    
    void on_twoButton_clicked();
    
    void on_threeButton_clicked();
    
    void on_fourButton_clicked();
    
    void on_fiveButton_clicked();
    
    void on_sixButton_clicked();
    
    void on_sevenButton_clicked();
    
    void on_eightButton_clicked();
    
    void on_nineButton_clicked();
    
    void on_ClearButton_clicked();
    
    void on_backButton_clicked();
    
    void on_zeroButton_clicked();
     
    void on_equalButton_clicked();
    
    void on_addButton_clicked();
    
    void on_divisorButton_clicked();
    
    void on_multipleButton_clicked();
    
    void on_minusButton_clicked();
       
    bool isOperatorRight(QString ch)const;   

private:
    Ui::Widget *ui;
    QString expression;//创建Qt字符串,用于表示对话框的显示
    QString testExpression;

    float num1=false,num2=0,result=false;
    float temResult=-1;
    char sign='0';
    int mark=1;
    bool addFlag=true;
    bool subFlag=true;
    bool mulFlag=true;
    bool divFlag=true;
};
#endif // WIDGET_H

2.引入widget.c文件

代码如下:

#include "widget.h"
#include "ui_widget.h"
#include "calculation.h"
#include <iostream>
using namespace std;
int num1,num2,num3,num4;

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    //固定控件框大小
    this->setMaximumSize (199,342);
    this->setMinimumSize (199,342);

    //定义字体
//        QFont font("微软雅黑",12);
    //设置对话框显示字体
//    ui->lineEdit->setFont (font);
    //设置右边输入的对话框
//    ui->lineEdit->setAlignment (Qt::AlignRight);
//    ui->testLineEdit->setAlignment (Qt::AlignRight);
}

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

void Widget::on_oneButton_clicked()
{
    num1=num1*10+1;
    expression=QString("%1").arg (num1);
    ui->lineEdit->setText (expression);
}


 void Widget::on_twoButton_clicked()
{
    num1=num1*10+2;
    expression=QString("%1").arg (num1);
    ui->lineEdit->setText (expression);
}


void Widget::on_threeButton_clicked()
{
    num1=num1*10+3;
    expression=QString("%1").arg (num1);
    ui->lineEdit->setText (expression);
}


void Widget::on_fourButton_clicked()
{
    num1=num1*10+4;
    expression=QString("%1").arg (num1);
    ui->lineEdit->setText (expression);
}


void Widget::on_fiveButton_clicked()
{
    num1=num1*10+5;
    expression=QString("%1").arg (num1);
    ui->lineEdit->setText (expression);
}


void Widget::on_sixButton_clicked()
{
    num1=num1*10+6;
    expression=QString("%1").arg (num1);
    ui->lineEdit->setText (expression);
}


void Widget::on_sevenButton_clicked()
{
    num1=num1*10+7;
    expression=QString("%1").arg (num1);
    ui->lineEdit->setText (expression);
}


void Widget::on_eightButton_clicked()
{
    num1=num1*10+8;
    expression=QString("%1").arg (num1);
    ui->lineEdit->setText (expression);;
}


void Widget::on_nineButton_clicked()
{
    num1=num1*10+9;
    expression=QString("%1").arg (num1);
    ui->lineEdit->setText (expression);
    
    qDebug()<<"num1:"<<num1<<";num2:"<<num2
    <<";result:"<<result<<endl;
}

void Widget::on_zeroButton_clicked()
{
    num1=num1*10;
    expression=QString("%1").arg (num1);
    ui->lineEdit->setText (expression);
}


void Widget::on_ClearButton_clicked()//"C"
{
    expression.clear ();
    ui->lineEdit->clear();
    
    testExpression.clear();
    ui->testLineEdit->clear ();
    
    num1=0;
    result=0;
    sign='0';
    addFlag=true;
    subFlag=true;
    mulFlag=true;
    divFlag=true;
}

void Widget::on_backButton_clicked()//"<-"
{

    qDebug()<<"now num1:"<<num1<<endl;//所有qDebug只是为了在终端测试
    expression=QString("%1").arg(num1);
    expression.chop(1);
    num1=QString(expression).toFloat();
    qDebug()<<"now num1:"<<num1<<endl;
    ui->lineEdit->setText (expression);
    
}

void Widget::on_equalButton_clicked()//"="
{qDebug()<<"sign="<<sign;
    switch(sign)
    {
        case'+':result+=num1;
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression); 
        break;
        case'-':result-=num1;
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
        break;
        case'*':result*=num1;
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
        break;
        case'/':result/=num1;
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
        break; 
        default:result=num1;
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);               
        break;   
    } 
    expression=QString("%1").arg(result);//float转QString    
    ui->lineEdit->setText (expression);
    //初始化标志符号

    qDebug()<<"Result:"<<result<<"Expression:"<<expression<<endl;
}


void Widget::on_addButton_clicked()//"+"
{
    if(expression.size()>0)//如果第一个输入不是数字,则无法输入运算符
    {      
            switch(sign)//计算前一个运算符
            {
                case'-':if(num1!=0)result-=num1;qDebug()<<"---"<<result<<endl;
                    break;

                case'*':if(num1!=0)result*=num1;//每次使用*运算后,num1就会清0.防止result误清0
                    break;
                case'/':if(num1!=0)result/=num1;
                    break; 
                default:              
                    break;       
            }               
            if(addFlag)//第一次运算符号为-减号时才会使用
            {
                result=num1;
                num1=0;
                qDebug()<<"result==false"<<endl;
                addFlag=false;
                subFlag=false;
                mulFlag=false;
                divFlag=false;
                
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
                testExpression='+';
                ui->lineEdit->setText (testExpression);
            }
            else
            {
                if(sign=='+')
                    result+=num1;           
                num1=0;                   
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
                testExpression='+';
                ui->lineEdit->setText (testExpression);
            }
    }
     sign='+';
}

void Widget::on_divisorButton_clicked()//"/"
{
    if(expression.size()>0)
    {
        if(isOperatorRight(expression.at (expression.size ()-1)))
        {
            switch(sign)//继承上次符号继承
            {
                case'+':if(num1!=0)result+=num1;
                    break;
                case'*':if(num1!=0)result*=num1;
                    break;
                case'-':if(num1!=0)result-=num1;
                    break; 
                default:              
                    break;       
            }
            if(divFlag)
            {
                qDebug()<<"//1//"<<result<<endl;
                result=num1;
                num1=0;            
                addFlag=false;
                subFlag=false;
                mulFlag=false;
                divFlag=false;
                
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
                testExpression='/';
                ui->lineEdit->setText (testExpression);
            }
            else
            {
                qDebug()<<"//2//"<<result<<endl;
                if(sign=='/')
                    result/=num1;                    
                num1=0;                             
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
                testExpression='/';
                ui->lineEdit->setText (testExpression);
            }  
        }
    }
sign='/';
}

void Widget::on_multipleButton_clicked()//"*"
{
    if(expression.size()>0)
    {
        if(isOperatorRight(expression.at (expression.size ()-1)))
        {
            switch(sign)
            {
                case'+':if(num1!=0)result+=num1;
                    break;
                case'-':if(num1!=0)result-=num1;
                    break;
                case'/':if(num1!=0)result/=num1;
                    break; 
                default:              
                    break;       
            }                 
            if(mulFlag)
            {
                result=num1;
                num1=0;qDebug()<<"**1**"<<result<<endl;
                addFlag=false;
                subFlag=false;
                mulFlag=false;
                divFlag=false;
                
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
                testExpression='*';
                ui->lineEdit->setText (testExpression);
            }
            else
            {qDebug()<<"**2**"<<result<<endl;
                if(sign=='*')
                    result*=num1;
                num1=0;                
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
                testExpression='*';
                ui->lineEdit->setText (testExpression);
            }
        }
    }
            sign='*';   
}

void Widget::on_minusButton_clicked()//"-"
{
    if(expression.size()>0)
    {
        if(isOperatorRight(expression.at (expression.size ()-1)))
        {
            switch(sign)//继承上次符号继承
            {
                case'+':if(num1!=0)result+=num1;qDebug()<<"+++"<<result<<endl;
                    break;

                case'*':if(num1!=0)result*=num1;
                    break;
                case'/':if(num1!=0)result/=num1;
                    break; 
                default:              
                    break;       
            }           
           
            if(subFlag)//第一次运算符号为-减号时才会使用
            {
                result=num1;
                num1=0;          
                addFlag=false;
                subFlag=false;
                mulFlag=false;
                divFlag=false;
                
                qDebug()<<"result==false"<<endl;
                subFlag=false;
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
                testExpression='-';
                ui->lineEdit->setText (testExpression);
            }
            else
            {
                if(sign=='-')
                    result-=num1;           
                num1=0;                   
                expression=QString("%1").arg(result);
                ui->testLineEdit->setText (expression);
                testExpression='-';
                ui->lineEdit->setText (testExpression);
            }
        }
    }
 sign='-';
}

bool Widget::isOperatorRight(QString ch)const//如果最后一个字符不是operator,返回真
{
    bool flag=true;
    if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
        flag=false;
    
    return flag;
}

总结

        看着多,很多都是重复代码。

        

  • 9
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值