基于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…

el-dialog点击esc退出时如何清除数据,如何触发方法

例如下面的el-dialog <el-dialog :title"title" :visible.sync"open" width"1400px" append-to-body close"handleDialogClose">...</el-dialog>当:visible.sync的时候才能键盘esc控制关闭窗口 当close的时候,键盘esc关闭…

12504 - Updating a Dictionary (UVA)

题目链接如下&#xff1a; Online Judge 我的代码如下&#xff1a; #include <string> #include <iostream> #include <map> #include <set> // #define debugint T, loc1, loc2; std::string s, key, value; char ch[] "-*";int main()…

Linux 中 initcall 机制详解

源码基于&#xff1a;Linux 5.4 0. 前言 Linux 对驱动程序提供静态编译进内核和动态加载两种方式&#xff0c;当采用静态方式时&#xff0c;开发者如果想要在系统中启动这个驱动通常调用类似 xxx_init() 接口。 最直观的做法&#xff1a;开发者试图添加一个驱动初始化程序时&…

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

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

电商中的百万量级

背景 我们一般在设计app架构或者访问量评估时&#xff0c;特别是在小公司时&#xff0c;老板总是希望我们能支持百万级的访问量&#xff0c;但是实际我们真的需要这么多吗&#xff0c;你知道百万访问的概念是多大吗 支持百万级 一般来说&#xff0c;百万级的页面访问也就意味…

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

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

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

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

近独立粒子的最概然分布

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

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

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

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

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

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

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

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

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

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

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

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

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Oracle数据库中的table@xyz是什么意思?

是DBlink访问外部表的语法。xyz是其他Oracle数据库在你所登录的用户下建立的Dblink名。通过这种方式访问其他数据库中的表。 在Oracle数据库中&#xff0c;表名后跟着符号和一个连接字符串&#xff08;xyz&#xff09;是一种用法&#xff0c;它用于指定要访问的远程数据库。 …

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

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

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

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

ST7789LCD调试笔记

1.采用4线模式SPI GND&#xff1a;接地引脚VCC&#xff1a;接电源引脚&#xff0c;接3.3V直流电源即可SCL&#xff1a;SPI的时钟线SCLKSDA&#xff1a;SPI的数据输入SDO: SPI的数据输出RES&#xff1a;复位接口&#xff0c;低电平初始化&#xff08;复位&#xff09;&#xff…

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

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