使用Qt做一个简单计算器
title: Calculator
date: 2022-09-04 11:10:12
tags: [Qt, 应用, C++]
typora-root-url: Calculator
使用Qt做一个简单计算器
能运行加减乘除、求余、求根运算。
环境
QtCreator
软件设计
采用简单的两层结构设计:UI层和逻辑层。软件比较简单,cpp文件只有5个。
代码编写
UI:MainWindow:
一个QTextBrowser,N个QPushButton。没有做样式。
点击按钮,输入响应数字、运算符,传递给逻辑层的CalculatorManger处理。处理完发送信号显示。
逻辑层:CalculatorManager
主要难点在于如何运算,这里使用后缀表达式的方法计算。
用户点击按钮输入的是中缀表达式,如:2+3,
在处理的时候给转成后缀表达式:2, 3, +,使用两个栈分别存数字和运算符。
- 这里需要注意的是,输入的运算符要和栈顶运算符比较:
- 栈顶优先级高,把数字栈栈顶两个元素pop()出来和预算符栈栈顶pop()进行运算,结果存入push()数字栈。再存入输入的运算符、数字。
- 输入的高,直接存。
- 这里需要注意的是,输入的运算符要和栈顶运算符比较:
用户输入“=”表示输入完成,将栈中元素依次pop()出,直到清空。
代码如下:
/*** @brief CalculatorManager::inputNumber:输入数字* @param iNum*/ void CalculatorManager::inputNumber(int iNum) {// 判断是不是小数if (!m_bDecimal)m_dInput = m_dInput * 10 + iNum;else{m_iCount ++;int i = m_iCount;double dNum = static_cast<double>(iNum);while (i--){dNum = dNum*1.0 / 10;}m_dInput = m_dInput + dNum;}m_strInput.append(QString::number(iNum));emit sig_show(m_strInput); }/*** @brief CalculatorManager::inputPoint: 点击小数点*/ void CalculatorManager::inputPoint() {// 防止重复输入if (m_bDecimal){emit sig_show("INPUT ERROR!");reset();}else {m_bDecimal = true;m_strInput.append(".");emit sig_show(m_strInput);} }/*** @brief CalculatorManager::inputOperator: 输入运算符* @param enOperator*/ void CalculatorManager::inputOperator(EnOperator enOperator) {switch(enOperator){case EN_PLUS: m_strInput.append(" + "); break;case EN_MINUS: m_strInput.append(" - "); break;case EN_TIMES: m_strInput.append(" x "); break;case EN_OVER: m_strInput.append(" ÷ "); break;case EN_MOD: m_strInput.append(" mod "); break;case EN_ROOT: m_strInput.append(" yroot "); break;case EN_NONE:default: break;}emit sig_show(m_strInput);m_stackNum.push(m_dInput);// 复位m_dInput = 0;m_bDecimal = false;m_iCount = 0;if (true == m_stackOp.empty()){m_stackOp.push(enOperator);}else{EnOperator enOpTop = m_stackOp.top();int iPri = bOpPri(enOpTop, enOperator);if (iPri){double num1 = m_stackNum.top();m_stackNum.pop();double num2 = m_stackNum.top();m_stackNum.pop();double dResult = 0.0;if(!compute(num1, num2, enOpTop, dResult)){reset();return ;}m_stackNum.push(dResult);m_stackOp.pop();m_stackOp.push(enOperator);}else{m_stackOp.push(enOperator);}} }/*** @brief CalculatorManager::clickedEqual: 点击=*/ void CalculatorManager::clickedEqual() {m_stackNum.push(m_dInput);m_dInput = 0;m_strInput = "";while (!m_stackOp.empty()){EnOperator enOp = m_stackOp.top();m_stackOp.pop();double num1 = m_stackNum.top();m_stackNum.pop();double num2 = m_stackNum.top();m_stackNum.pop();double dResult = 0.0;if(!compute(num1, num2, enOp, dResult)){reset();return ;}m_stackNum.push(dResult);}double dResult = m_stackNum.top();emit sig_show(QString::number(dResult));reset(); }
运行结果
代码地址:nanoahSR/QtCalculator: Make a simply calculator with Qt (github.com)
TODO
- 求余、求根的优先级好像还有些问题
- 括号
- 幂运算、对数,缺少很多功能
- 键盘输入
- 。。。
使用Qt做一个简单计算器相关推荐
- 做一个简单计算器(两个数的加减乘除)扣扣116119409
做一个简单计算器(两个数的加减乘除) 一.语言和环境 a)实现语言Java b)环境要求Android Studio 二.要求: 1.可以清空,可以回退(一个一个回退): 2.按下去之后textvie ...
- c语言设计程序计算器,C语言程序设计,做一个简单计算器
题目: C语言程序设计,做一个简单计算器 程序内容有:加减乘除和平方,立方,开方等.用if或者swith结构来编程. 算加法时只输出加法的结果,算减法时只出减法的结果,如此类推. 解答: 已发送, # ...
- QT实现一个简单计算器
QT实现一个简单计算器 学生一枚,水平有限,如有问题,还望指正 第一步 通过QT设计师绘制出界面图形,界面大致如下: 第二步 将保存的.ui文件转换为头文件,以便于自己创建的对象对其继承和使用 uic ...
- Matlab中用GUI做计算器,怎样用MATLAB中的GUI做一个简单计算器
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function varargout = jisuanqi(varargin) gui_Singleton = 1; gui_State = struct ...
- android用kotlin制作计算器,使用Kotlin做一个简单计算器
样式如下图: 1.布局文件: xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http: ...
- MATLAB中计算器的设立,怎样用MATLAB中的GUI做一个简单计算器
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function varargout = jisuanqi(varargin) gui_Singleton = 1; gui_State = struct ...
- linux qt小型计算器,Qt实现一个简单的计算器
Qt实现一个简单的计算器 作者:hackett 微信公众号:加班猿 一.UI界面版 运行效果:输入num1和num2选择+-*/点击计算即可 UI界面设计: 3个lineEdit(lineEditNu ...
- 用c++做一个简单的计算器
用C++做一个简单的计算器 本教程的主要内容是如何使用C++做一个简单的计算器.它可以实现最基本的计算功能,提供5种计算方式. 全部代码如下: #include <iostream> // ...
- 【Python】如何用python做一个简单的输入输出交互界面?
看到知乎上有人在问,如何使用Python做一个简单的输入输出交互界面? 交互界面就涉及到GUI编程. Python有很多GUI框架,功能大同小异. 其中比较出名的有「PyQT」.**wxPython. ...
最新文章
- 如何使用php将字符从全角转为半角
- 避免App沦为“僵尸”的12个秘诀
- springboot redis 刷新时间_「SpringBoot实战」SpringCache + Redis实现数据缓存
- 曾惨遭 Google、Tesla 淘汰,辗转 8 个月,他是如何成为一名顶尖的 AI 工程师?...
- 高效点的全排列算法---堆算法(跟堆排序没关系)
- 让serialversionUID自动生成方法
- python输出结果换行_如果Python中有很多换行,可以选择使用...表示多行内容...
- 视频播放器+控制器--封装
- MATLAB-典型动态系统建模与仿真
- 杭州电子科技大学第三届网络攻防大赛初赛题目
- 渲染的本质: 纹理过滤(Texture filtering)技术
- 李宏毅自然语言处理——指代消歧
- 淘宝前端工程师:国内WEB前端开发十日谈
- 大白话说 Reactor 模型
- 8个你最想知道的数据中台问题,我们这次聊个透
- Python实现手机号归属地查询
- 1.uap项目迁移到idea开发的详细教程(第壹篇)
- IDEA rebuild project idea如何重新编译项目
- 私服github开源项目
- 科研作图及科研汇报PPT规范
热门文章
- 零基础学C语言 第3版 pdf
- [二分查找] [luoguP3500] [POI2010] TES-Intelligence Test
- 6000字长文,带你用Python完成 “Excel合并(拆分)” 的各种操作!
- 校园卡查询系统C语言,校园卡帐号的查询方法
- android语音输入文字,盘点好用的语音输入APP,懒得打字的时候就说话吧!
- 论文研读-基于种群分布的两阶段自适应知识迁移多目标进化多任务
- 每天一个俯卧撑的健身法 - 微习惯实践
- C1实训-动态令牌(二次验证码)原理及实现
- ubuntu下安装Google谷歌浏览器(64位系统)
- SpringBoot JPA多对一 持久化是报错object references an unsaved transient instance - save the transient instanc