Qt实现简易计算器

article/2025/10/12 0:50:10

目录

写在前面

一、设计思路

效果展示:

二、功能实现

三、设计代码

1.mainwindow.cpp

2.calculate.cpp


写在前面

上篇文章写了C++中如何实现简单的计算器,先用C++写看来我的选择是正确的,明白了其中的原理再用Qt实现是水到渠成的事,利用Qt实现计算器可视化的核心思想就是如何把在按钮上输入的表达式在文本框中读取!!


一、设计思路

    用Qt实现计算器,首先得在ui界面设计一个计算器,当然也可以代码写,我觉得没必要就直接拖啦,而且槽函数也可以直接转到,非常方便。

    那么首先如何将按钮上的数字和符号显示在文本框上并读取呢?用setText函数就OK啦,这里有很多种方法,我用的方法是原来文本有的加上输入的,这样就能源源不断输入了,比如点击0的槽函数:

ui->lineEdit->setText(ui->lineEdit->text() +'0');

    在这其中等于号的槽函数最重要,因为点击等于号‘=’需要将表达式读取并且计算显示在文本框上,需要注意的是我们在文本框输入的数据编程环境并不能识别,需要将它转换成utf8编码的格式,而输出时又需要转换成字符串的类型:

void calculator::on_pushButtonequal_clicked()
{string str = ui->lineEdit->text().toStdString();double result=Stack(str);//数字转为字符串显示在lineEdit中ui->lineEdit->setText(QString::number(result));
}

    那么到这事情就简单多啦!现在需要编写计算器的表达式计算即可,我这里另外建了一个cpp,方便书写,不懂计算器原理的可以看上篇文章 C++实现简单计算器哦。不够这次肯定是有点不一样的,多了小数点,而且我还加了三角函数的计算,这让calculate的函数参数不得不改变了,上次是两个栈,这次的字符栈我换成了字符型参数。

效果展示:

二、功能实现

  •  支持的运算有+,-,*,/,%,^,sqrt
  •  支持三角函数运算
  •  支持括号运算
  •  支持单目运算符+和-的运算

三、设计代码

1.mainwindow.cpp

由于很多都是重复的,这里我只挑不重复的出来。

    setFixedSize(360,530);ui->lineEdit->setReadOnly(true);//可以设置按钮字体的大小ui->pushButton0->setFont(QFont("宋体", 15));//AC槽函数void calculator::on_pushButtonAC_clicked()
{ui->lineEdit->clear();
}//退格槽函数void calculator::on_pushButtondel_clicked()
{ui->lineEdit->backspace();
}

2.calculate.cpp

#include"c++calculate.h"
#include<iostream>
#include<string>
#include<stack>
#include<math.h>
using namespace std;
double Stack(string str){//表达式入栈stack<double> Num;stack<char> Ch;int i = 0, j;int size = str.size();string num;char temp;while (i < size) {if (str[i] >= '0' && str[i] <= '9') {j = i;    while ((j < size && str[j] >= '0' && str[j] <= '9') || str[j]=='.') { j++; }//从下标i开始截取长度为j-i的字符num = str.substr(i, j - i);//atof函数将字符串转换成浮点型数Num.push(atof(num.c_str()));i = j;}else if(str[i]=='('||str[i]==')'){if (str[i]=='(') Ch.push(str[i]);else{while(Ch.top()!='('){temp=Ch.top();Ch.pop();calculate(temp, Num);}Ch.pop();//左括号出栈!!这里我忘了两次!!}i++;}else{if (Ch.empty()) {Ch.push(str[i]);}else {while (!Ch.empty()) {temp = Ch.top();if (operate(temp) >= operate(str[i])) {Ch.pop();calculate(temp, Num);}else break;}Ch.push(str[i]);}i++;}}while(!Ch.empty()){temp=Ch.top();Ch.pop();calculate(temp,Num);}return Num.top();
}
int operate(char ch){if(ch=='(') return 0;else if(ch=='+'||ch=='-') return 1;else if(ch=='*'||ch=='/'||ch=='%') return 2;else if(ch=='s'||ch=='c'||ch=='t'||ch=='q') return 3;else return 4;
}
void calculate(char temp,stack<double>&Num){double a=Num.top();Num.pop();double innum;if(temp=='!'){innum=1;while(a>1){innum*=a;a--;}}else if(temp=='s')innum=sin(a);else if(temp=='c')innum=cos(a);else if(temp=='t')innum=tan(a);else if(temp=='q')innum=sqrt(a);else{double b=Num.top();Num.pop();if(temp=='+')innum=b+a;else if(temp=='-')innum=b-a;else if(temp=='*')innum=b*a;else if(temp=='/')innum=b/a;else if(temp=='^')innum=pow(b,a);else if(temp=='%')innum=fmodf(b,a);}Num.push(innum);
}
注意在添加.cpp文件的时候需要也把.h文件添加,在头文件中添加所需要的类和声明相应的函数。

上述Stack函数和calculate函数都与我之前写的有所不同,因为小数点和三角函数的问题,下面说说他们的不同之处:

1.首先是calculate函数,刚开始我想传入栈作为参数的,但是在三角函数那里,如果出栈两次,程序会运行不了,总之种种原因,最后利用这种先出栈再传入的方式写。

2.小数点需要利用j判断后面有多少位小数,再通过相应的函数转换成浮点型的数。

3.while循环中,之前是等号作为出口,现在明显不行,然后就换了一个出口,其实上篇C++那个这样写也是可以的,方式不同而已。


http://chatgpt.dhexx.cn/article/b3r9v8L4.shtml

相关文章

vue实现复制功能

目录 一、vue实现复制功能 1.功能实现 2.模板结构 3.js行为 4.样式 二.延伸扩展 一、vue实现复制功能 1.功能实现 点击复制弹出复制成功信息&#xff0c;粘贴即可获得复制数据。 2.模板结构 在自己想要复制的内容所在标签上添加一个类名和一个点击事件方法&#xff0c;…

多态的实现

多态实现条件 在Java中要实现多态&#xff0c;那么必须要满足以下几个条件&#xff0c;缺一不可&#xff1a; 必须在继承体系下 子类必须要对父类中的方法进行重写 通过父类的引用调用重写的方法 多态体现&#xff1a;在代码运行时&#xff0c;当传递不同类对象时&#xff0c;…

java实现接口

接口的简述&#xff1a; 1、在java编程语言中&#xff0c;接口是属于抽象类型的&#xff0c;是抽象方法的结合&#xff0c;用interface来定义接口&#xff0c;一个类通过继承接口的方式&#xff0c;从而来继承接口的抽象方法&#xff1b;类可以继承接口&#xff0c;但是接口不可…

java实现链表

一、链表定义 链表通过指针将一组零散的内存块串联在一起进行使用。 数据格式&#xff1a; 根据上面的图展示&#xff0c;每个内存块可以称为链条的一个“结点”&#xff0c;结点包含了数据和下一个结点的地址&#xff1b;同时有2个结点特殊&#xff1a;第一个结点和最后一个…

redis实现延迟队列

前言&#xff1a;redis实现延迟队列该怎么做&#xff1f;在这里我分享一下 redis实现延迟队列 一、Redis实现延迟队列二、redis失效监听事件三、此种实现面临的问题四、开发准备五、基础实现六、使用redisson实现延迟队列七、redisson实现延迟队列的原理八、延迟队列配置九、疑…

如何设置时间格式

如何设置时间格式 开发工具与关键技术&#xff1a;VisualStudio C# 作者&#xff1a;落白 撰写时间&#xff1a;2019/06/26时间格式的转换是一个令人头疼的存在&#xff0c;格式稍微出了一点差错就保存不进数据库&#xff0c;或者在类型为时间类型的input标签中显示不出来。搞…

html如何修改时间,html怎么设置时间

html设置时间的方法&#xff1a;首先创建一个div&#xff1b;然后给该div添加一个class属性&#xff1b;最后通过“function realSysTime(clock){...}”方法设置时间即可。 本文操作环境&#xff1a;windows7系统、HTML5&&CSS3版、Dell G3电脑。 HTML设置一个当前时间s…

心跳检测时间设置

Eureka Client 向 Eureka Server 发送心跳的频率&#xff08;默认 30 秒&#xff09; client eureka:instance:# 如果x秒内&#xff0c;依然没有收到续约请求&#xff0c;判定服务过期,默认90slease-expiration-duration-in-seconds: 50# 每隔x秒钟&#xff0c;向服务中心发送…

window下时间设置

用了蛮长时间搞出点东西&#xff0c;还被上面鄙视了一番&#xff0c;算了不抱怨了&#xff0c;在鄙视中成长&#xff0c;在鄙视中强大。 我主要是完成两个两个功能:第一个是设置系统时间将其转换成十六进制精确到分钟显示出来&#xff08;这个VC中有现成的api&#xff0c;以前…

Date、Time、DateTimes设置

撰写时间&#xff1a;2019年06月16日 在数据库中设置的Date、Time、datetime类型&#xff0c;在Vs中Date、datetime便会自动转化为DataTIme类型&#xff0c;而Time类型则会转化为TimeSpan类型 常常在查出时间、日期的数据时都会乱码&#xff0c;就像下图一样&#xff0c;那么…

如何更改Windows服务器时间

Windows操作系统自带时间同步功能&#xff0c;它会自动从互联网时间服务器获取时间&#xff0c;以保证系统时间的准确性。但是&#xff0c;有时候我们需要更改时间服务器&#xff0c;以获得更准确的时间同步。小编将为大家介绍如何更改Windows时间服务器&#xff0c;以及Window…

Windows将时间设置到秒的方法

使用win10系统的用户应该都发现了&#xff0c;Win10系统右下角时间只显示到分&#xff0c;不会显示到秒&#xff0c;如果想要看到秒的话&#xff0c;需要点击一下时间才会弹出。那么&#xff0c;Win10系统时间怎么显示到秒? 默认情况下&#xff0c;需要点击后方可查看时间详情…

设置linux的时间

目录 一、什么是时间 &#xff08;1&#xff09;例子1 &#xff08;2&#xff09;例子2 二、什么是本地时间 三、linux设置本地时间的方法 &#xff08;1&#xff09;方式一&#xff1a;通过互联网自动同步 1.修改时间同步服务器 2.查看时间同步情况 &#xff08;2&…

win10电脑时间同步设置方法

win10系统的时间与日期默认是跟网络时间同步的&#xff0c;这样可以保持电脑时间的准确。不过有网友反映自己的win10电脑时间不对&#xff0c;调准时间后过段时间又是如此&#xff0c;不知道如何设置win10电脑时间同步。下面小编就教下大家win10电脑时间同步设置方法。 具体的…

简单3招教你设置电脑时间

案例&#xff1a;电脑时间怎么设置&#xff1f; 【我使用电脑时&#xff0c;电脑显示的时间一直不对&#xff0c;这导致我非常不方便&#xff0c;想问下大家平常使用电脑时有什么设置电脑时间比较简单的方法吗&#xff1f;】 电脑的时间设置很重要&#xff0c;不仅可以保证电…

超越函数e^(-x^2)收敛

超越函数e(-x2)收敛 Γ ( z ) ∫ 0 ∞ e − x 2 d t . \Gamma(z) \int_0^\infty e^{-x^2}dt\,. Γ(z)∫0∞​e−x2dt. 原函数不能直接积分所以采用极坐标变换的方式求解&#xff0c;本人自用码住

积分抵现

积分抵现设置教程 积分抵现 积分抵现包括积分抵现比率、是否开启积分抵现和积分说明。 其中&#xff0c;积分抵现比率为 1积分可抵多少元现金 转载于:https://my.oschina.net/u/4103048/blog/3099967

常见不可积积分

from sympy import * x symbols(x) a sin(x)/x b exp(x**2) c cos(x)/x d sin(x**2) e cos(x**2) f x/ln(x) g ln(x)/(x1) A integrate(a,x) # Si(x)-->超越函数 B integrate(b,x) # sqrt(pi)*erfi(x)/2-->erfi(x)误差函数 C integrate(c,x) # -log…

超越函数e^(-x^2)在(-∞, +∞)上的定积分的两种解法

令 解法一 二重积分极坐标 故 解法二 Γ函数余元公式 又由余元公式&#xff0c;有 于是 故

加速度计求二次积分

我是勤劳的搬运工&#xff1a;https://blog.csdn.net/u011006622/article/details/56286833 摘要 此文档描述并使用MMA7260QT三轴加速计和低功耗的9S08QG8八位单片机实现求解位置的算法 。 在今天先进的电子市场&#xff0c;有不少增加了许多特性和智能的多功能的产品。定…