基于QT的简易计算器(一)

目录

  • 0 简介
  • 1.设计原理
  • 1.1界面设计
    • 1.1.1界面基本布局
    • 1.1.2 界面调整和美化
    • 1.1.2 控件重命名
  • 1.2 连接信号和槽
  • 1.3 软件逻辑
    • 1.3.1四则运算
    • 1.3.2 连续运算(不完全)的原理
    • 1.3.3 清屏
    • 1.3.4 退格
    • 1.3.5 等于
    • 1.3.6 小数点
  • 2.总结与拓展

0 简介

最近在学QT,总体感觉和MFC没有太大的区别,自己跟着哔哩哔哩的老师做了个简易计算器。相关资料如下:

课程链接:风骚程序员】QT游戏开发入门到实战课堂视频精讲,QT桌面应用程序开发,史上最全的QT视频教程系统,游戏开发角度讲解QT入门
项目链接:
链接:https://pan.baidu.com/s/1znbxUV1hi065Kncs814-Rw
提取码:cx9j

限于篇幅,项目创建发布的具体方法可能会在后续的帖子中发出,敬请期待。。。

作为基础项目,并没有做过于复杂的功能。只有整数和小数的四则运算。主要内容如下所示:

1.设计原理

1.1界面设计

1.1.1界面基本布局

先拖拽Line Edit控件和Push Button控件到相应位置,然后再做细化和整理。
在这里插入图片描述

1.1.2 界面调整和美化

确定好控件的大致位置后,我们可以选定按钮,然后点击“栅格布局”按钮,自动调整间距。如下图所示。
在这里插入图片描述
然后我们可以调整按键的颜色等属性。以背景色为例

在想要改变样式的控件上方,鼠标右击菜单中选择“改变样式表”,点击“添加颜色”,选择“背景色”然后选择喜欢的颜色即可。
在这里插入图片描述

1.1.2 控件重命名

为了项目开发和维护方便,往往需要对控件进行重命名。所以我们在此对各个控件进行重命名。
直接点击控件,然后在属性列表中修改相应的属性即可。
在这里插入图片描述

1.2 连接信号和槽

由于项目比较小,所以我们将所有信号都绑定到同一个槽函数Onclicked中进行处理。程序如下:

    //绑定数字connect(ui->pushButton_0,&QPushButton::clicked,this,[this](){Onclicked(Num, "0");});connect(ui->pushButton_1,&QPushButton::clicked,this,[this](){Onclicked(Num, "1");});connect(ui->pushButton_2,&QPushButton::clicked,this,[this](){Onclicked(Num, "2");});connect(ui->pushButton_3,&QPushButton::clicked,this,[this](){Onclicked(Num, "3");});connect(ui->pushButton_4,&QPushButton::clicked,this,[this](){Onclicked(Num, "4");});connect(ui->pushButton_5,&QPushButton::clicked,this,[this](){Onclicked(Num, "5");});connect(ui->pushButton_6,&QPushButton::clicked,this,[this](){Onclicked(Num, "6");});connect(ui->pushButton_7,&QPushButton::clicked,this,[this](){Onclicked(Num, "7");});connect(ui->pushButton_8,&QPushButton::clicked,this,[this](){Onclicked(Num, "8");});connect(ui->pushButton_9,&QPushButton::clicked,this,[this](){Onclicked(Num, "9");});//绑定运算符connect(ui->pushButton_plus,&QPushButton::clicked,this,[this](){Onclicked(Op, "+");});connect(ui->pushButton_sub,&QPushButton::clicked,this,[this](){Onclicked(Op, "-");});connect(ui->pushButton_mul,&QPushButton::clicked,this,[this](){Onclicked(Op, "*");});connect(ui->pushButton_div,&QPushButton::clicked,this,[this](){Onclicked(Op, "/");});//其他按钮绑定connect(ui->pushButton_clear,&QPushButton::clicked,this,[this](){Onclicked(Clear, "Clear");});connect(ui->pushButton_backspace,&QPushButton::clicked,this,[this](){Onclicked(BackSpace, "BackSpace");});connect(ui->pushButton_equ,&QPushButton::clicked,this,[this](){Onclicked(Equal , "=");});connect(ui->pushButton_dot,&QPushButton::clicked,this,[this](){Onclicked(Dot , ".");});

1.3 软件逻辑

1.3.1四则运算

此次我们的软件功能只涉及两个数的运算,所以需要先区分算式中的两个数据
以运算符为分界,运算符之前的数据为第一个数据,之后的为第二个参与运算的数据,如下所示:

            if(mOp.isEmpty()){mNum1 += _btn;}else{mNum2 += _btn;}

然后就是四则运算的具体实现,这里我们封装了一个运算函数,来实现具体的功能。

void Widget::Cal_res(bool *is_right, double *res)
{if(mNum1.isEmpty() || mNum2.isEmpty() || mOp.isEmpty()){*is_right = false;*res = 0.0;return ;}double num1 = mNum1.toDouble();double num2 = mNum2.toDouble();double result = 0;if(mOp == '+')result = num1 + num2;else if(mOp == '-')result = num1 - num2;else if(mOp == '*')result = num1 * num2;else if(mOp == '/'){if(num2 != 0)result = num1 / num2;else{ui->lineEdit->setText("error!");{*is_right = 0;*res = 0;return ;}}}ui->lineEdit->setText(QString::number(result));*is_right = true;*res = result;return ;
}

is_right参数来反映是否得到了正确的结果,错误为false,正确为true;
res参数返回具体的计算结果。

  1. 首先是if的条件判断,如果缺少数据或者运算符,此时无法计算,直接返回。
  2. 接下来根据具体的运算符执行相关的逻辑计算,当除数为0时终止计算,并输出error
  3. 得到正确的计算结果,并返回。

1.3.2 连续运算(不完全)的原理

在此次项目中,我们实现了连续运算,但是并未考虑到运算符的优先级等问题,只是在进行下次运算时,自动计算上一个算式的计算结果,所以我们做了如下的处理:

            if(!mNum1.isEmpty()){if(!mNum2.isEmpty()){Cal_res(&is_right, &res);if(is_right){mNum1 = QString::number(res);mNum2.clear();}}mOp = _btn;}

也就是说,直接将上次的运算结果赋值给mNum1 ,然后再执行接下来的运算。

1.3.3 清屏

清除(清屏)的逻辑比较简单,只需将数据清除,使之显示为空即可。

            mNum1.clear();mNum2.clear();mOp.clear();

后面就是我们显示的语句:

    ui->lineEdit->setText(mNum1 + mOp + mNum2);

1.3.4 退格

退格是非常常见的操作,在写错的时候可以点击退格,然后重新输入需要计算的数据或运算符。退格实现的原理如下:

            if(!mNum2.isEmpty())mNum2.chop(1);else if(!mOp.isEmpty())mOp.chop(1);else if(!mNum1.isEmpty())mNum1.chop(1);elsereturn ;

由于我们的算式是mNum1+mOp+mNum2的格式,退格是从后往前逐一删除的,所以要反向判断,如果有相关字符串5,直接将末尾的字符清除,再重新显示即可。

1.3.5 等于

等号就是计算并显示结果,而我们在前面的小节中已经阐述了核心的计算逻辑,接下来直接调用相关的接口即可:

            Cal_res(&is_right, &res);mNum1.clear();mNum2.clear();mOp.clear();return ;

我们调用函数得到了相应的结果,然后再将相关的数据清零,以便进行下次计算。

1.3.6 小数点

小数点的添加就比较讲究了,我们先看看实现的具体程序:

            if(mOp.isEmpty()){if((!mNum1.isEmpty()) && (!mNum1.contains('.'))){mNum1 += _btn;}}else{if((!mNum2.isEmpty()) && (!mNum2.contains('.'))){mNum2 += _btn;}}

也就是说,先判断是否为空,如果没有位值,则小数点将没有任何意义,然后就判断该小数点应该添加的位置,然后完成添加。

2.总结与拓展

显然,这只是一个基本的小项目,还有很多功能值得开发和探索,如果有时间,还会更新后续帖子,并在一下方面做出延伸和拓展,敬请期待。。。

  • 增加更换皮肤的功能
  • 界面可缩放
  • 连续计算时可显示整个算式
  • 增加小括号运算符号
  • 可保存历史(前几次)计算结果
  • 增加键盘输入功能

红色部分不是必须的,但是可以提升使用体验。
蓝色部分是从计算本身的功能出发,需要做出的一些改进。

-----------------------------------------------------------END-------------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/128205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django实战项目-学习任务系统-自定义URL拦截器

接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。 首先增加URL拦截器,你不会希望没有登录用户就可以进入用户主页各种功能的,所以增加URL拦截器可以解决这个问题。 Django框架本身也有URL拦截器&#xff0…

【Python入门二】安装第三方库(包)

安装第三方库/包 1 使用pip安装2 使用PyCharm软件安装3 离线安装,使用whl文件安装参考 在Python中,有多种安装第三方库的方法,下面是一些常用的方法: 1 使用pip安装 pip是Python中最常用的包管理工具,也是最常用的在线…

代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集

背包问题 说到背包问题大家都会想到使用动规的方式来求解,那么为什么用动规呢,dp数组代表什么呢?初始化是什么,遍历方式又是什么,这篇文章笔者将详细讲解背包问题的经典例题0-1背包问题和完全背包问题的解题方式,希望能帮助到大家 1.暴力方式 有人一提到背包问题就只会使用动态…

OpenGL ES入门教程(一)编写第一个OpenGL程序

OpenGL ES入门教程(一)编写第一个OpenGL程序 前言 从本文开始我将参考学习OpenGL ES应用开发实践指南 Android卷 [(美)KevinBrothaler著](提取码: 394m),并基于自己的理解以更加通俗易懂的方式…

近独立粒子的最概然分布

近独立粒子:粒子之间相互作用微弱基本粒子中,自旋量子数为半整数的有 电子 、 质子 、中子、中微子自旋量子数为整数的有 光子、pi介子 经典力学描述系统的微观运动状态 经典力学中,全同粒子可以分辨量子力学,全同粒子不可以分辨微…

2023-11-02 LeetCode每日一题(环和杆)

2023-11-02每日一题 一、题目编号 2103. 环和杆二、题目链接 点击跳转到题目位置 三、题目描述 总计有 n 个环,环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings ,表示这 n 个环在…

BetterDisplay Pro v1.4.15(显示器管理管理软件)

BetterDisplay Pro是一款屏幕显示优化工具,可用于Windows和Mac操作系统。它可以帮助用户调整屏幕的亮度、对比度、色彩等参数,以获得更好的视觉体验。此外,BetterDisplay Pro还提供了一些额外的功能,如屏幕分割、窗口管理、快捷键…

Django3框架-(3)-[使用websocket]:使用channels实现websocket功能;简化的配置和实际使用方式

概述: 对于Django使用channels实现websocket的功能,之前就写了几篇博文了。随着在项目的使用和实际维护来说,重新设置了相关处理方法。 一般来说,前后端都只维护一个全局的连接,通过携带数据来判断具体的操作&#x…

Flink1.18新特性生产环境应用的重点解读!

大家好,我是你们的群主王知无呀。 Flink 1.18已经于近期发布了。在这个新版本中新增了很多新的功能和特性。在这些特性中,有一些是生产环境非常重要的能力,大家在使用过程中可以重点参考和了解其中的原理。 算子级别状态保留时间TTL设置 首先…

GitHub经常打不开或者访问解决办法

访问慢或无法访问的原因:DNS解析是最为基础的一个环节。由于Github的服务器在全球各地,域名解析所需的时间也会不同,这就导致了在特定地区可能会出现Github无法正常访问的情况。 解决:查询到github对应的IP,然后在host…

精准测试:提高软件质量和用户满意度的利器

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

腾讯云域名备案后,如何解析到华为云服务器Linux宝塔面板

一、购买域名并且进行备案和解析,正常情况下,购买完域名,如果找不到去哪备案,可以在腾讯云上搜索“备案”关键词就会出现了,所以这里不做详细介绍,直接进行步骤提示: 二、申请ssl证书&#xff0…

uniapp使用抖音微信自定义组件

tt.vue中使用video-player组件 用到的目录如下: pages.json {"path": "pages/Tabbar/tt/tt","style": {"navigationBarTitleText": "","enablePullDownRefresh": false,// 使用自定义组件"using…

Nginx服务器安装证书并启用SSL(acme.sh)

前提 您已购置vps服务器,例如阿里云全球站ecs、AWS EC2、Azure VM、GCP Compute等安全组已开启80、443端口,且访问源设置为0.0.0.0/0域名已设置A记录指向当前操作服务器,若您使用aws ec2,有公有 IPv4 DNS,可供使用 安…

2023年最新版潮乎盲盒源码含搭建教程

后台开发语言:后端 Laravel 框架开发 前端开发框架:uniappvue 环境配置: php7.4 mysql5.6 nginx1.22 redis(建议宝塔面板或 lnmp) 源码获取请自行百度:一生相随博客 一生相随博客致力于分享全网优质资源&#x…

Python条件判断的运用

问题 在生活中,我们可以通过判断条件是否成立,来决定执行哪个分支。选择语句有多种形式:if语句,if-else语句,if-elif-else语句等。 Python使用if条件判断语句来实现条件判断时,可以在多个循环中实现对问题的…

JAVA亡了?那么多岗位去哪了?

1.java现在有多卷? 虽然近年来出现了许多其他编程语言和技术。但JAVA依旧是热度最高的。它仍然被广泛用于大型企业应用、后端开发、Android应用开发以及嵌入式系统等领域。此外,Java在大数据、云计算和物联网等新兴领域也有着重要的地位。 因此&#x…

基于OR-Tools的装箱问题模型求解(PythonAPI)

装箱问题 一、背包问题(Knapsack problem)1.1 0-1背包模型基于OR-Tools的0-1背包问题求解(PythonAPI)导入pywraplp库数据准备声明MIP求解器初始化决策变量初始化约束条件目标函数调用求解器打印结果 1.2 多重背包问题(…

一篇博客读懂顺序表 —— Sequence-List

目录 一、顺序表的初始定义 1.1新建头文件和源文件 1.2 SeqList.h 中的准备工作 二、顺序表的初始化与销毁 三、首尾插入元素 四、首尾删除元素 五、中间插入元素 六、中间删除元素 七、查找指定元素下标 八、源代码 一、顺序表的初始定义 1.1新建头文件和源文件 当我…

流媒体服务实现H5实时预览视频

目录 背景方案业务实践细节注意 待办 背景 客户aws服务磁盘存储告急,最高可扩容16T。排查如下:主要是视频文件存在大量复制使用的情况。例如发布节目时复制、预览时复制,这样上传一份视频后最大会有四份拷贝(预览、普通发布、互动…