QT Creator实现计算器(四则运算)

基本步骤

  1. 首先创建一个新项目

  1. 双击forms文件夹下的mainwindow.ui,设计计算器的显示界面

  1. mainwindow.h中的MainWindow类里添加各个按钮对应的槽函数、需要用到的成员变量和实现四则运算的函数 的声明。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    int flag;//标记运算中是否产生小数
    double Do();//计算表达式
    bool isOpr(const char *c);//判断字符是否是数字
    double Cal(double a,char b,double c);//按优先级入栈或者进行局部运算
    int prior(char c);//判断运算符优先级
    QString strin;
    const char* getNum(const char *p,double &num);
    int preOrder(char opt1,char opt2);

private:
    Ui::MainWindow *ui;

    //各个按钮对应的函数
    void pushButton_plus();
    void pushButton_sub();
    void pushButton_divide();
    void pushButton_equal();
    void pushButton_multiply();
    void pushButton_0();
    void pushButton_1();
    void pushButton_2();
    void pushButton_3();
    void pushButton_4();
    void pushButton_5();
    void pushButton_6();
    void pushButton_7();
    void pushButton_8();
    void pushButton_9();
    void pushButton_delete();
    void pushButton_clear();
    void pushButton_point();
    
    //报错函数
    bool operror();
};

#endif // MAINWINDOW_H
  1. mainwindow.cpp中实现上一步所声明的函数,并且在MainWindow类的构造函数里面绑定按钮和其对应的槽函数。

这里只实现了计算器的加减乘除、清除、退位等运算操作。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMainWindow>
#include <QMessageBox>
#include <QStack>

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWindow){
    ui->setupUi(this);
    setWindowTitle("田甜的计算器");
    ui->textEdit_inOut->setReadOnly(true);//textEdit_inOut内容不可更改
    ui->textEdit_inOut->setText("0");
    strin="";
    flag=0;
    
    //绑定按钮与处理函数
    connect(ui->pushButton_0,&QPushButton::clicked,[this](){pushButton_0();});
    connect(ui->pushButton_1,&QPushButton::clicked,[this](){pushButton_1();});
    connect(ui->pushButton_2,&QPushButton::clicked,[this](){pushButton_2();});
    connect(ui->pushButton_3,&QPushButton::clicked,[this](){pushButton_3();});
    connect(ui->pushButton_4,&QPushButton::clicked,[this](){pushButton_4();});
    connect(ui->pushButton_5,&QPushButton::clicked,[this](){pushButton_5();});
    connect(ui->pushButton_6,&QPushButton::clicked,[this](){pushButton_6();});
    connect(ui->pushButton_7,&QPushButton::clicked,[this](){pushButton_7();});
    connect(ui->pushButton_8,&QPushButton::clicked,[this](){pushButton_8();});
    connect(ui->pushButton_9,&QPushButton::clicked,[this](){pushButton_9();});
    connect(ui->pushButton_plus,&QPushButton::clicked,[this](){pushButton_plus();});
    connect(ui->pushButton_sub,&QPushButton::clicked,[this](){pushButton_sub();});
    connect(ui->pushButton_equal,&QPushButton::clicked,[this](){pushButton_equal();});
    connect(ui->pushButton_divide,&QPushButton::clicked,[this](){pushButton_divide();});
    connect(ui->pushButton_multiply,&QPushButton::clicked,[this](){pushButton_multiply();});
    connect(ui->pushButton_delete,&QPushButton::clicked,[this](){pushButton_delete();});
    connect(ui->pushButton_clear,&QPushButton::clicked,[this](){pushButton_clear();});
    connect(ui->pushButton_point,&QPushButton::clicked,[this](){pushButton_point();});
}

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

//实现按钮的处理函数
void MainWindow::pushButton_0(){
    if(strin=="")
        ui->textEdit_inOut->clear();
    strin+="0";
    ui->textEdit_inOut->textCursor().insertText("0");
}
void MainWindow::pushButton_1(){
    if(strin=="")
        ui->textEdit_inOut->clear();
    strin+="1";
    ui->textEdit_inOut->textCursor().insertText("1");
}
void MainWindow::pushButton_2(){
    if(strin=="")
        ui->textEdit_inOut->clear();
    strin+="2";
    ui->textEdit_inOut->textCursor().insertText("2");
}
void MainWindow::pushButton_3(){
    if(strin=="")
        ui->textEdit_inOut->clear();
    strin+="3";
    ui->textEdit_inOut->textCursor().insertText("3");
}
void MainWindow::pushButton_4(){
    if(strin=="")
        ui->textEdit_inOut->clear();
    strin+="4";
    ui->textEdit_inOut->textCursor().insertText("4");
}
void MainWindow::pushButton_5(){
    if(strin=="")
        ui->textEdit_inOut->clear();
    strin+="5";
    ui->textEdit_inOut->textCursor().insertText("5");
}
void MainWindow::pushButton_6(){
    if(strin=="")
        ui->textEdit_inOut->clear();
    strin+="6";
    ui->textEdit_inOut->textCursor().insertText("6");
}
void MainWindow::pushButton_7(){
    if(strin=="")
        ui->textEdit_inOut->clear();
    strin+="7";
    ui->textEdit_inOut->textCursor().insertText("7");
}
void MainWindow::pushButton_8(){
    if(strin=="")
        ui->textEdit_inOut->clear();
    strin+="8";
    ui->textEdit_inOut->textCursor().insertText("8");
}
void MainWindow::pushButton_9(){
    if(strin=="")
        ui->textEdit_inOut->clear();
    strin+="9";
    ui->textEdit_inOut->textCursor().insertText("9");
}


void MainWindow::pushButton_plus(){
    strin+="+";
    ui->textEdit_inOut->moveCursor(QTextCursor::End);
    ui->textEdit_inOut->textCursor().insertText("+");
    operror();
}
void MainWindow::pushButton_sub(){
    strin+="-";
    ui->textEdit_inOut->moveCursor(QTextCursor::End);
    ui->textEdit_inOut->textCursor().insertText("-");
    operror();
}
void MainWindow::pushButton_multiply(){
    strin+="*";
    ui->textEdit_inOut->moveCursor(QTextCursor::End);
    ui->textEdit_inOut->textCursor().insertText("*");
    operror();
}
void MainWindow::pushButton_divide(){
    strin+="/";
    ui->textEdit_inOut->moveCursor(QTextCursor::End);
    ui->textEdit_inOut->textCursor().insertText("/");
    operror();
}

void MainWindow::pushButton_clear(){
    strin="";
    ui->textEdit_inOut->setText("0");
}

void MainWindow::pushButton_delete(){
    strin.chop(1);
    ui->textEdit_inOut->textCursor().deletePreviousChar();
}


void MainWindow::pushButton_equal(){
    strin+="#";
    if(operror())
        return;
    double d=Do();
    QString s;
    if(flag==0){//运算结果为整数
        s=QString::number(d); //实现从int转为QString型
    }else{//运算结果为小数
        s=QString("%1").arg(d);//double转QString
    }
    ui->textEdit_inOut->setText(s);

    strin="";
    strin+=s;
}
void MainWindow::pushButton_point(){
    strin+=".";
    flag=1;
    ui->textEdit_inOut->textCursor().insertText(".");
    operror();
}

bool MainWindow::operror()
{ //输入运算符,若运算符前无数字,则报错
    char *s=strin.toLocal8Bit().data();
    if(!isdigit(s[strlen(s)-2]))
    {
        QMessageBox::about(this,"error!","您输入的双目运算符或小数点无左值");
        strin.chop(1);
        ui->textEdit_inOut->textCursor().deletePreviousChar();
        return true;
    }
    return false;
}


double MainWindow::Do(){
    double x;     //储存当前已出栈表达式的运算的结果
    QStack<char> opChar; //储存运算符的栈
    char c;     //保存stack.top()的值
    QStack<double> opDouble;   //储存数字的栈
    double e1,e2,e=0;   //存储已出栈的数字和最终运算结果
    opChar.push('#');
//    char *p = strin.toLatin1().data();   //实现从QString到*char的转换,若strin中含中文会导致最后运算结果错误
    std::string str=strin.toStdString();
    const char* p=str.c_str();//QString先转为string再转为char*,即可避免因中文字符而出现的乱码

    while(*p!='#')
    {
        if(isOpr(p))  //把字符转化为数字并入数字栈
        {
            p = getNum(p,e);
            opDouble.push(e);
        }
        else if(opChar.top()!='#'&&opDouble.size()>=2)     //如果不是数字而是运算符,则对此运算符和栈顶运算符的优先级进行比较
        {
            c = opChar.top();
            if(preOrder(*p,c)>0) //当前入栈的运算符比栈顶的运算符优先级高则入栈
            {
                opChar.push(*p);
            }else      //当前入栈的运算符优先级小于等于栈顶的运算符优先级则栈顶运算符出栈并出栈两个数据进行计算
            {
                if(c=='/')flag=1;
                opChar.pop();
                e1 = opDouble.top();
                opDouble.pop();
                e2 = opDouble.top();
                opDouble.pop();
                x =Cal(e2,c,e1);
                opDouble.push(x);  //当前运算结果入栈

                if(*p=='+'||*p=='-'||*p=='*'||*p=='/')
                {
                    opChar.push(*p);
                }
            }
        }else{ //opchar为空栈或opdouble中不足两个数,直接入栈
            if(*p=='+'||*p=='-'||*p=='*'||*p=='/')
            {
                opChar.push(*p);
            }
        }
        p++;
    }

    if(*p=='#')
    {
        c = opChar.top();
        opChar.pop();
        while(c!='#'&&opDouble.size()>=2)
        {
            if(c=='/')flag=1;
            e1 = opDouble.top();
            opDouble.pop();
            e2 = opDouble.top();
            opDouble.pop();
            x =Cal(e2,c,e1);
            opDouble.push(x);

            c = opChar.top();
            opChar.pop();
        }

    }
    e = opDouble.top();//最终结果
    opDouble.pop();
    return e;
}

bool MainWindow::isOpr(const char *c){//判断是否为运算对象
    if(*c>='0'&&*c<='9'||*c=='.')
        return true;
    else return false;
}

double MainWindow::Cal(double a,char b,double c){//实现四则运算
    switch(b){
    case '+':
        return a+c;
    case '-':
        return a-c;
    case '*':
        return a*c;
    case '/':
        return a/c;
    default:
        ui->textEdit_inOut->setText("wrong!");
    }
}

const char* MainWindow::getNum(const char *p,double &num)//将char型字符换成数字
{
    QString temStr="";
    while(isOpr(p))
    {
        if(*p=='.')flag=1;
        temStr+=*p;
        p++;
    }
    num=temStr.toDouble();
    p--;
    return p;
}

int MainWindow::prior(char c){
    switch(c){
    case '#':
        return 0;
    case '+':
    case '-':
        return 1;
    case '*':
    case '/':
        return 2;
    default:
        return -1;
    }
}

int MainWindow::preOrder(char c1,char c2)//比较两个运算符的优先级
{
    int i = prior(c1);
    int j = prior(c2);
    if(i==-1||j==-1)
        return -1;
    if(i>j)
        return 1;
    else if(i==j)
        return 0;
    else
        return -1;
}

  1. main.cpp中生成一个MainWindow对象,并调用它。

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
  1. 编译并且运行。

到这里就结束啦!!

这是我的第一个qt项目,我是一个纯正的新手小白,刚接触qt不超过一周,本文章有借鉴其他文章,若有错误欢迎指出!

  • 11
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八月和我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值