使用QT制作一个简单的计算器(不考虑优先级)

本文介绍了一个简易计算器的设计与实现过程,包括数字与运算符的输入处理、基本算术运算的实现等核心功能。通过Qt框架创建GUI界面,实现了按钮点击事件响应及简单的数学计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mainwindow.h

数字0~9和点关联同一个槽函数,+ - * /对应另外一个槽函数
按钮是从ui设计界面拖过来的

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QString>
#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:  //声明了私有的槽函数

    void fun();  //数字0~9和点关联同一个槽函数

    void otherfun();  // + - * /

    void on_theback_clicked();//退格

    void on_myresult_clicked();//等于号

    void on_init0_clicked();//归零

private:
    Ui::MainWindow *ui;
    double sum = 0;
    int flag = 0;//标志位:+ - * / 对应 1 2 3 4
    int otherflag = 0;//记录上一次 + - * / 对应 1 2 3 4
    int  flag1 = 0;//其他标志位
    int  flag2 = 0;//=标志位
    QString temp; //临时存放两次输入的要进行计算的项
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QPushButton>
#include <QLineEdit>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->num0,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->num1,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->num2,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->num3,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->num4,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->num5,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->num6,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->num7,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->num8,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->num9,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->point,SIGNAL(clicked(bool)),this,SLOT(fun()));
    connect(ui->theplus,SIGNAL(clicked(bool)),this,SLOT(otherfun()));
    connect(ui->noplus,SIGNAL(clicked(bool)),this,SLOT(otherfun()));
    connect(ui->chengfa,SIGNAL(clicked(bool)),this,SLOT(otherfun()));
    connect(ui->chufa,SIGNAL(clicked(bool)),this,SLOT(otherfun()));
    setWindowTitle(tr("简易计算器"));

    ui->lineEdit->setEnabled(false);//设置不可以手动输入
    ui->lineEdit_2->setEnabled(false);
}

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

void MainWindow::fun()
{
    //获取信号的发送者
    QPushButton *p=qobject_cast<QPushButton *>(sender());

    ui->lineEdit->setText(ui->lineEdit->text()+p->text());
    ui->lineEdit_2->setText(ui->lineEdit_2->text()+p->text());
}

void MainWindow::otherfun()
{
    //获取信号的发送者
     QPushButton *p=qobject_cast<QPushButton *>(sender());
     if(p->text()=="+") //加法
         flag=1;
     else if(p->text()=="-")
         flag=2;
     else if(p->text()=="*")
         flag=3;
     else if(p->text()=="/")
         flag=4;
     if(flag1 == 0)
     {
         sum = ui->lineEdit_2->text().toDouble();
         QString line;
         line.clear(); //清空字符数组line中的内容
         ui->lineEdit_2->setText(line);
         flag1++;
         flag2++;
         ui->lineEdit->setText(ui->lineEdit->text()+p->text());
         otherflag = flag;
         return ;
     }
     flag1++;
     if(flag2 == 0)
     {
         flag2++;
         QString line;
         line.clear(); //清空字符数组line中的内容
         ui->lineEdit_2->setText(line);
         ui->lineEdit->setText(ui->lineEdit->text()+p->text());
         otherflag = flag;
         return ;
     }
     flag2++;
     temp = ui->lineEdit_2->text(); //获取前面输入的字符,并临时保存起来

     if(otherflag == 1) //加法
         sum = sum+temp.toDouble(); //将字符转换成浮点型
     if(otherflag == 2) //-
         sum = sum-temp.toDouble(); //将字符转换成浮点型
     if(otherflag == 3) //*
         sum = sum*temp.toDouble(); //将字符转换成浮点型
     if(otherflag == 4) // /
         sum = sum/temp.toDouble(); //将字符转换成浮点型

     ui->lineEdit_2->setText(QString::number(sum)); //将浮点型转换成字符
     ui->lineEdit->setText(ui->lineEdit->text()+p->text());
     QString line;
     line.clear(); //清空字符数组line中的内容
     ui->lineEdit_2->setText(line);
     otherflag = flag;
}

void MainWindow::on_theback_clicked()//删除
{
    int a = ui->lineEdit->text().size() - 1;
    if(ui->lineEdit->text().at(a)=='+'||ui->lineEdit->text().at(a)=='-'||ui->lineEdit->text().at(a)=='*'||ui->lineEdit->text().at(a)=='/')
    {
        qDebug()<<"您最后一次按了操作运算符,无法退格";
        return;
    }
    QString line = ui->lineEdit->text();
    line.chop(1);
    ui->lineEdit->setText(line);
    line = ui->lineEdit_2->text();
    line.chop(1);
    ui->lineEdit_2->setText(line);
}

void MainWindow::on_myresult_clicked()
{
    flag2 = 0;
    if(flag == 1)
    {
        temp = ui->lineEdit_2->text(); //获取前面输入的字符,并临时保存起来
        sum = temp.toDouble() + sum; //将字符转换成浮点型
        ui->lineEdit_2->setText(QString::number(sum)); //将浮点型转换成字符
        ui->lineEdit->setText(ui->lineEdit->text()+"="+QString::number(sum));
        QString line;
        line.clear(); //清空字符数组line中的内容
        ui->lineEdit_2->setText(line);
    }
    if(flag == 2)
    {
        temp = ui->lineEdit_2->text(); //获取前面输入的字符,并临时保存起来
        sum = sum-temp.toDouble(); //将字符转换成浮点型
        ui->lineEdit_2->setText(QString::number(sum)); //将浮点型转换成字符
        ui->lineEdit->setText(ui->lineEdit->text()+"="+QString::number(sum));
        QString line;
        line.clear(); //清空字符数组line中的内容
        ui->lineEdit_2->setText(line);
    }
    if(flag == 3)
    {
        temp = ui->lineEdit_2->text(); //获取前面输入的字符,并临时保存起来
        sum = sum * temp.toDouble(); //将字符转换成浮点型
        ui->lineEdit_2->setText(QString::number(sum)); //将浮点型转换成字符
        ui->lineEdit->setText(ui->lineEdit->text()+"="+QString::number(sum));
        QString line;
        line.clear(); //清空字符数组line中的内容
        ui->lineEdit_2->setText(line);
    }
    if(flag == 4)
    {
        temp = ui->lineEdit_2->text(); //获取前面输入的字符,并临时保存起来
        sum = sum / temp.toDouble(); //将字符转换成浮点型
        ui->lineEdit_2->setText(QString::number(sum)); //将浮点型转换成字符
        ui->lineEdit->setText(ui->lineEdit->text()+"="+QString::number(sum));
        QString line;
        line.clear(); //清空字符数组line中的内容
        ui->lineEdit_2->setText(line);
    }

    ui->lineEdit_2->setText(QString::number(sum)); //将浮点型转换成字符
}

void MainWindow::on_init0_clicked()//归零
{
    flag1 = 0;
    flag2 = 0;
    QString line = ui->lineEdit->text();
    line.clear(); //清空字符数组line中的内容
    ui->lineEdit->setText(line);
    ui->lineEdit_2->setText(line);
    sum = 0;
}

效果图:由于未考虑优先级,所以从左往右计算结果等于8
由于未考虑优先级,所以从左往右计算结果等于8

附言:如果有谁看了我这篇博文后发现有bug,可以留言告诉我。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值