基于C++的Qt计算器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、设计计算器界面
- 二、代码分析
- 1.
- 2.
- 总结
前言
本文是基于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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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误清0break;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;
}
总结
看着多,很多都是重复代码。
基于C++的Qt计算器相关推荐
- 基于PyQt5的简易计算器
基于PyQt5的简易计算器之四 提示:基于PyQt5的简易计算器之一为环境搭建 基于PyQt5的简易计算器之二为Qt Designer使用 基于PyQt5的简易计算器之三为按键的功能实现 基于PyQt ...
- 基于QT5实现简易计算器
基于QT5实现简易计算器 一.写在前面 二.成品展示 三.界面布局 四.按钮功能 五.源码下载 六.补充 一.写在前面 软件介绍: 仿照win10计算器,基于qt5实现具有简单运算的计算器. 环境: ...
- Qt计算器开发(二):信号槽实现数学表达式合法性检查
表达式的合法性 由于我们的计算器不是单步计算的,所以我们能够一次性输入一个长表达式.然而假设用户输入的长表达式不合法的话,那么就会引发灾难.所以有必要对于用户的输入做一个限制. 一些限制举例: 比方, ...
- 简单计算器的设计java_(基于java的简易计算器的设计.doc
(基于java的简易计算器的设计 基于java的简易计算器的设计 摘要 自从java语言诞生以来,java语言就以不可抵挡的趋势很快成为国际上广泛流行的面向对象编程语言,它既具有高级语言的特点,又少了 ...
- 基于VTK与Qt的体绘制程序
基于VTK与Qt的体绘制程序 分类: VTK Qt Volume Rendering C&C++ 2013-06-10 09:17 3434人阅读 评论(13) 收藏 举报 目录(?)[+] ...
- arm linux qt 输入法,基于ARM9和Qt的中文手写输入法的设计与实现
摘要: 由于基于ARM9和Qt的嵌入式平台没有手写输入法,而且当前存在的手写体汉字识别核心应用在该平台上存在资源占用大.识别速度慢.开发不便等缺点,因此开发一个基于ARM9和Qt平台的中文手写输入法具 ...
- AVR单片机计算器C语言源程序,一个基于AVR单片机的计算器程序.doc
一个基于AVR单片机的计算器程序 #include #include//延时函数的头文件 #include // 中断函数的头文件 #define uint unsigned int #define ...
- 基于JavaScript实现网页计算器
基于JavaScript的网页计算器 基于HTML.CSS.JavaScript制作的网页计算器,其中可以实现加.减.乘.除.取整.求余.阶乘.科学计数等功能 界面如下: 代码如下: 有兴趣的朋友欢迎 ...
- 基于WPF的科学计算器程序
基于WPF的科学计算器程序 1.前言 2.界面展示 2.1标准计算器界面 2.2科学计算器界面 3.功能分析 4.代码实现 4.1窗体拖动 4.2界面切换 4.3运算符优先级 4.4功能函数 5.结语 ...
最新文章
- Balkan2007]Toponyms[链式前向星建字典树+getchar()读入优化]
- cgroup限制oracle,Yarn 使用 Cgroup 实现任务资源限制
- ML:分类预测问题中评价指标(ER/混淆矩阵P-R-F1/ROC-AUC/RP/mAP)简介、使用方法、代码实现、案例应用之详细攻略
- php ajax 重复提交,php+ajax远程加载避免重复提交
- NOIP2016洛谷P1600:天天爱跑步
- Xception,Inception-ResNet,SENet(Squeeze-and-Excitation)
- linux磁盘管理的命令行,Linux磁盘管理命令介绍
- iPhone SE 2渲染图曝光:采用刘海全面屏
- 运营商的光猫有四个输出端口,哪个带宽最大?
- 重磅上线|国内首个 Kubernetes SIG-Cloud-Provider 子项目揭秘
- 控制台应用程序《石头剪刀布》——新手,
- 在exe运行界面按右键(不用按鼠标右键)
- python100题语感练习_Python 100题练习8
- UEFI开发探索75- YIE001PCIe开发板(08 跑马灯实验)
- Endnote 导出英文、中文(知网)参考文献进入Word
- 《漫步华尔街》书中的精髓:在美国市场中,怎样用“随机漫步”的投资方法让自己的投资收益稳步增长
- ①(语法篇)、《史上最全iOS八股文面试题》2022年,金三银四我为你准备了,iOS《1000条》笔试题以及面试题(包含答案)。带面试你过关斩将,(赶紧过来背iOS八股文)
- 聚合供应链,Saas系统,商品供应链
- 视频火焰烟雾光线闪电科技粒子破碎特效PR标题模板
- B站总结某up主面试题(持续等待更新......)
热门文章
- 广百集团数字化转型,Infortrend统一存储一站打通
- 无胁科技-TVD每日漏洞情报-2022-7-30
- autocad 2021 mac中文版
- 编程:假设有n个人进行排名,允许并列排名,名次并列人的不同顺序算一种,总共有多少种排名?
- 电视盒子安装CUPS共享惠普1020为无线网络打印机【新版】
- 制作简单的个人网站,将本地网站公布在网络上
- MATLAB与安捷伦lan口通讯,matlab与安捷伦示波器通讯问题
- android 蘑菇街组件化,4. IOS 组件化(蘑菇街的路由+协议式)
- 雪球产品期权价值蒙特卡洛模拟(1)
- talent-aio