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

主要难点在于如何运算,这里使用后缀表达式的方法计算。

  1. 用户点击按钮输入的是中缀表达式,如:2+3,

  2. 在处理的时候给转成后缀表达式:2, 3, +,使用两个栈分别存数字和运算符。

    1. 这里需要注意的是,输入的运算符要和栈顶运算符比较:

      1. 栈顶优先级高,把数字栈栈顶两个元素pop()出来和预算符栈栈顶pop()进行运算,结果存入push()数字栈。再存入输入的运算符、数字。
      2. 输入的高,直接存。
  3. 用户输入“=”表示输入完成,将栈中元素依次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做一个简单计算器相关推荐

  1. 做一个简单计算器(两个数的加减乘除)扣扣116119409

    做一个简单计算器(两个数的加减乘除) 一.语言和环境 a)实现语言Java b)环境要求Android Studio 二.要求: 1.可以清空,可以回退(一个一个回退): 2.按下去之后textvie ...

  2. c语言设计程序计算器,C语言程序设计,做一个简单计算器

    题目: C语言程序设计,做一个简单计算器 程序内容有:加减乘除和平方,立方,开方等.用if或者swith结构来编程. 算加法时只输出加法的结果,算减法时只出减法的结果,如此类推. 解答: 已发送, # ...

  3. QT实现一个简单计算器

    QT实现一个简单计算器 学生一枚,水平有限,如有问题,还望指正 第一步 通过QT设计师绘制出界面图形,界面大致如下: 第二步 将保存的.ui文件转换为头文件,以便于自己创建的对象对其继承和使用 uic ...

  4. Matlab中用GUI做计算器,怎样用MATLAB中的GUI做一个简单计算器

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function varargout = jisuanqi(varargin) gui_Singleton = 1; gui_State = struct ...

  5. android用kotlin制作计算器,使用Kotlin做一个简单计算器

    样式如下图: 1.布局文件: xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http: ...

  6. MATLAB中计算器的设立,怎样用MATLAB中的GUI做一个简单计算器

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function varargout = jisuanqi(varargin) gui_Singleton = 1; gui_State = struct ...

  7. linux qt小型计算器,Qt实现一个简单的计算器

    Qt实现一个简单的计算器 作者:hackett 微信公众号:加班猿 一.UI界面版 运行效果:输入num1和num2选择+-*/点击计算即可 UI界面设计: 3个lineEdit(lineEditNu ...

  8. 用c++做一个简单的计算器

    用C++做一个简单的计算器 本教程的主要内容是如何使用C++做一个简单的计算器.它可以实现最基本的计算功能,提供5种计算方式. 全部代码如下: #include <iostream> // ...

  9. 【Python】如何用python做一个简单的输入输出交互界面?

    看到知乎上有人在问,如何使用Python做一个简单的输入输出交互界面? 交互界面就涉及到GUI编程. Python有很多GUI框架,功能大同小异. 其中比较出名的有「PyQT」.**wxPython. ...

最新文章

  1. 如何使用php将字符从全角转为半角
  2. 避免App沦为“僵尸”的12个秘诀
  3. springboot redis 刷新时间_「SpringBoot实战」SpringCache + Redis实现数据缓存
  4. 曾惨遭 Google、Tesla 淘汰,辗转 8 个月,他是如何成为一名顶尖的 AI 工程师?...
  5. 高效点的全排列算法---堆算法(跟堆排序没关系)
  6. 让serialversionUID自动生成方法
  7. python输出结果换行_如果Python中有很多换行,可以选择使用...表示多行内容...
  8. 视频播放器+控制器--封装
  9. MATLAB-典型动态系统建模与仿真
  10. 杭州电子科技大学第三届网络攻防大赛初赛题目
  11. 渲染的本质: 纹理过滤(Texture filtering)技术
  12. 李宏毅自然语言处理——指代消歧
  13. 淘宝前端工程师:国内WEB前端开发十日谈
  14. 大白话说 Reactor 模型
  15. 8个你最想知道的数据中台问题,我们这次聊个透
  16. Python实现手机号归属地查询
  17. 1.uap项目迁移到idea开发的详细教程(第壹篇)
  18. IDEA rebuild project idea如何重新编译项目
  19. 私服github开源项目
  20. 科研作图及科研汇报PPT规范

热门文章

  1. 零基础学C语言 第3版 pdf
  2. [二分查找] [luoguP3500] [POI2010] TES-Intelligence Test
  3. 6000字长文,带你用Python完成 “Excel合并(拆分)” 的各种操作!
  4. 校园卡查询系统C语言,校园卡帐号的查询方法
  5. android语音输入文字,盘点好用的语音输入APP,懒得打字的时候就说话吧!
  6. 论文研读-基于种群分布的两阶段自适应知识迁移多目标进化多任务
  7. 每天一个俯卧撑的健身法 - 微习惯实践
  8. C1实训-动态令牌(二次验证码)原理及实现
  9. ubuntu下安装Google谷歌浏览器(64位系统)
  10. SpringBoot JPA多对一 持久化是报错object references an unsaved transient instance - save the transient instanc