#QT(一种朴素的计算器实现方法)

1.IDE:QTCreator


2.实验:这是全靠自己想法写的计算器,没有参考任何教程。

(1)这个计算器只要有运算符敲入就会进行一次运算,所以他没有先后之后,无法满足运算优先级。

(2)小数点第六位有小概率出现不准的情况。

(3)实时计算的值存放在全局变量total中。

(4)是将字符串转为数字

(5)用一个temp_text来记录数字,每次运算符按下会将其转换为数字然后计算完毕之后将其清空。而最上面的text则只是一个界面,用于观察自己输入的运算式子。

(6)第三条text专门用于显示结果,只有=按下时才会显示结果。


3.记录


4.代码

widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

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_one_pb_clicked();

    void on_add_pb_clicked();

    void on_calculator_pb_clicked();

    void on_multiply_pb_clicked();

    void on_except_pb_clicked();

    void on_subtract_pb_clicked();

    void on_two_pb_clicked();

    void on_three_pb_clicked();

    void on_four_pb_clicked();

    void on_five_pb_clicked();

    void on_six_pb_clicked();

    void on_seven_pb_clicked();

    void on_eight_pb_clicked();

    void on_nine_pb_clicked();

    void on_zero_pb_clicked();

    void on_dot_pb_clicked();

    void on_clear_pb_clicked();

    void on_delete_pb_clicked();

    void on_resi_pb_clicked();

private:
    Ui::Widget *ui;
    QChar last_ysf;     //记录上一次运算符是什么
    uint8_t index1;     // *
    uint8_t index2;     // /
    uint8_t index3;     // %
    uint8_t index4;     // +
    uint8_t index5;     // -
    float number_temp;  //临时记录运算数字
    float total;        //结果
};
#endif // WIDGET_H

widget.cpp

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

}

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



void Widget::on_calculator_pb_clicked()     //calculate
{
    number_temp=ui->temp->text().toFloat();

    if(last_ysf=='*')
        total = total*number_temp;
    else if(last_ysf=='/')
        total = total/number_temp;
    else if(last_ysf=='%'){
        int resi_temp;
        int total_temp;
        resi_temp=ui->temp->text().toInt();  //求余必须为整数
        total_temp=total;
        total = total_temp % resi_temp;
    }
    else if(last_ysf=='+')
        total = total+number_temp;
    else if(last_ysf=='-')
        total = total-number_temp;


    last_ysf='=';                    //记录本次的运算符号
    ui->temp->clear();

    QString result_string = QString::asprintf("%.6f",total);
    ui->lineEdit->insert("=");               //插入一个*显示符
    ui->lineEdit->insert(result_string);

    ui->result->setText(result_string);
}


void Widget::on_multiply_pb_clicked()   // *
{
    number_temp=ui->temp->text().toFloat();
    ui->lineEdit->insert("*");               //插入一个*显示符
    if(last_ysf=='*')
        total = total*number_temp;
    else if(last_ysf=='/')
        total = total/number_temp;
    else if(last_ysf=='%'){
        int resi_temp;
        int total_temp;
        resi_temp=ui->temp->text().toInt();  //求余必须为整数
        total_temp=total;
        total = total_temp % resi_temp;
    }
    else if(last_ysf=='+')
        total = total+number_temp;
    else if(last_ysf=='-')
        total = total-number_temp;
    else
        total = number_temp;

    last_ysf='*';                    //记录本次的运算符号
    ui->temp->clear();
}


void Widget::on_except_pb_clicked()   //  /
{
    number_temp=ui->temp->text().toFloat();
    ui->lineEdit->insert("/");               //插入一个*显示符
    if(last_ysf=='*')
        total = total*number_temp;
    else if(last_ysf=='/')
        total = total/number_temp;
    else if(last_ysf=='%'){
        int resi_temp;
        int total_temp;
        resi_temp=ui->temp->text().toInt();  //求余必须为整数
        total_temp=total;
        total = total_temp % resi_temp;
    }
    else if(last_ysf=='+')
        total = total+number_temp;
    else if(last_ysf=='-')
        total = total-number_temp;
    else
        total = number_temp;

    last_ysf='/';                    //记录本次的运算符号
    ui->temp->clear();
}

void Widget::on_add_pb_clicked()    // +
{

    number_temp=ui->temp->text().toFloat();
    ui->lineEdit->insert("+");               //插入一个*显示符
    if(last_ysf=='*')
        total = total*number_temp;
    else if(last_ysf=='/')
        total = total/number_temp;
    else if(last_ysf=='%'){
        int resi_temp;
        int total_temp;
        resi_temp=ui->temp->text().toInt();  //求余必须为整数
        total_temp=total;
        total = total_temp % resi_temp;
    }
    else if(last_ysf=='+')
        total = total+number_temp;
    else if(last_ysf=='-')
        total = total-number_temp;
    else
        total = number_temp;

    last_ysf='+';                    //记录本次的运算符号
    ui->temp->clear();

}

void Widget::on_subtract_pb_clicked()   // -
{
    number_temp=ui->temp->text().toFloat();
    ui->lineEdit->insert("-");               //插入一个*显示符
    if(last_ysf=='*')
        total = total*number_temp;
    else if(last_ysf=='/')
        total = total/number_temp;
    else if(last_ysf=='%'){
        int resi_temp;
        int total_temp;
        resi_temp=ui->temp->text().toInt();  //求余必须为整数
        total_temp=total;
        total = total_temp % resi_temp;
    }
    else if(last_ysf=='+')
        total = total+number_temp;
    else if(last_ysf=='-')
        total = total-number_temp;
    else
        total = number_temp;

    last_ysf='-';                    //记录本次的运算符号
    ui->temp->clear();
}

void Widget::on_resi_pb_clicked()  // %
{
    number_temp=ui->temp->text().toFloat();
    ui->lineEdit->insert("%");               //插入一个*显示符
    if(last_ysf=='*')
        total = total*number_temp;
    else if(last_ysf=='/')
        total = total/number_temp;
    else if(last_ysf=='%'){
        int resi_temp;
        int total_temp;
        resi_temp=ui->temp->text().toInt();  //求余必须为整数
        total_temp=total;
        total = total_temp % resi_temp;
    }
    else if(last_ysf=='+')
        total = total+number_temp;
    else if(last_ysf=='-')
        total = total-number_temp;
    else
        total = number_temp;

    last_ysf='%';                    //记录本次的运算符号
    ui->temp->clear();
}


void Widget::on_one_pb_clicked()    //1
{
    ui->lineEdit->insert("1");
    ui->temp->insert("1");
}

void Widget::on_two_pb_clicked()  // 2
{
    ui->lineEdit->insert("2");
    ui->temp->insert("2");
}



void Widget::on_three_pb_clicked() //3
{
    ui->lineEdit->insert("3");
    ui->temp->insert("3");
}



void Widget::on_four_pb_clicked() //4
{
    ui->lineEdit->insert("4");
    ui->temp->insert("4");
}


void Widget::on_five_pb_clicked()  //5
{
    ui->lineEdit->insert("5");
    ui->temp->insert("5");
}


void Widget::on_six_pb_clicked()  //6
{
    ui->lineEdit->insert("6");
    ui->temp->insert("6");
}


void Widget::on_seven_pb_clicked()  //7
{
    ui->lineEdit->insert("7");
    ui->temp->insert("7");
}


void Widget::on_eight_pb_clicked()  //8
{
    ui->lineEdit->insert("8");
    ui->temp->insert("8");
}


void Widget::on_nine_pb_clicked()  //9
{
    ui->lineEdit->insert("9");
    ui->temp->insert("9");
}


void Widget::on_zero_pb_clicked()  //0
{
    ui->lineEdit->insert("0");
    ui->temp->insert("0");
}


void Widget::on_dot_pb_clicked()  // .
{
    ui->lineEdit->insert(".");
    ui->temp->insert(".");
}


void Widget::on_clear_pb_clicked() //清除
{
    ui->lineEdit->clear();
    ui->temp->clear();
    ui->result->clear();
    total=0;
}


void Widget::on_delete_pb_clicked() //退格
{
    uint8_t index;
    QString str;
    index=ui->lineEdit->text().length();
    str=ui->lineEdit->text();
    str.remove(index-1,1);        //去除末尾一个字符
    ui->lineEdit->setText(str);

    uint8_t index2;
    QString str2;
    index2=ui->temp->text().length();
    str2=ui->temp->text();
    str2.remove(index2-1,1);        //去除末尾一个字符
    ui->temp->setText(str2);
}
相关推荐
blasit3 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
郑州光合科技余经理7 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1238 天前
matlab画图工具
开发语言·matlab
dustcell.8 天前
haproxy七层代理
java·开发语言·前端
norlan_jame8 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone8 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054968 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月8 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237178 天前
C语言-数组练习进阶
c语言·开发语言·算法
Railshiqian8 天前
给android源码下的模拟器添加两个后排屏的修改
android·开发语言·javascript