基于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.rhkb.cn/news/178830.html

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

相关文章

Ubuntu MySQL客户端功能介绍(mysql-client)mysql命令(mysql客户端命令)数据库导出、数据库导入

文章目录 Ubuntu MySQL客户端(mysql-client)功能介绍MySQL客户端与服务端服务器端(MySQL Server)客户端(MySQL Client) 安装MySQL客户端连接到MySQL服务器(mysql -h host -u user -p)执行SQL查询批处理模式…

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

文章目录 数据结构总结ArrayList源码底层LinkedList底层源码 迭代器底层 数据结构 对于数据结构我这边只告诉你右边框框里的 栈的特点:后进先出,先进后出,入栈也成为压栈,出栈也成为弹栈 栈就像一个弹夹 队列先进先出后进后出 队列像排队 链表查询满 但是增删快(相对于数组而…

EViews| 基础操作 备战下周机考

目录 一、创建工作文件 1、非时间序列数据 2、时间序列数据 二、导入数据 1、导入数据 2、保存数据组合或方程结果 三、估计回归模型 1、估计回归模型 2、回归结果名词解读 四、检验模型设定错误 1、检验是否遗漏变量 2-1、检验是否加入了不相干变量 2-2、惩罚新增…

springboot2.x使用@RestControllerAdvice实现通用异常捕获

文章目录 demo地址实现效果引入基础类准备1.通用枚举与错误状态枚举2.定义通用返回结果3.自定义业务异常 统一异常捕获测试 demo地址 demo工程地址 实现效果 当我们输入1时,正常的返回通用的响应结果当我们输入2时,抛出异常,被捕获然后返回…

Docker学习——①

文章目录 1、什么是虚拟化、容器化?2、为什么要虚拟化、容器化?3、虚拟化实现方式3.1 应用程序执行环境分层3.2 虚拟化常见类别3.3 常见虚拟化实现3.3.1 主机虚拟化(虚拟机)实现3.3.2 容器虚拟化实现3.3.3 空间隔离实战--基础知识3.3.4 PID 隔离3.3.5 Mo…

没有PDF密码,如何解密文件?

PDF文件有两种密码,一个打开密码、一个限制编辑密码,因为PDF文件设置了密码,那么打开、编辑PDF文件就会受到限制。想要解密,我们需要输入正确的密码,但是有时候我们可能会出现忘记密码的情况,或者网上下载P…

Linux-----nginx的简介,nginx搭载负载均衡以及nginx部署前后端分离项目

目录 nginx的简介 是什么 nginx的特点以及功能 Nginx负载均衡 下载 安装 负载均衡 nginx的简介 是什么 Nginx是一个高性能的开源Web服务器和反向代理服务器。它的设计目标是为了解决C10k问题,即在同一时间内支持上万个并发连接。 Nginx采用事件驱动的异…

听GPT 讲Rust源代码--library/std(12)

题图来自 Decoding Rust: Everything You Need to Know About the Programming Language[1] File: rust/library/std/src/os/watchos/mod.rs 该文件(rust/library/std/src/os/watchos/mod.rs)的作用是为Rust标准库提供支持WatchOS操作系统的特定功能。 W…

C语言实现俄罗斯方块游戏

文章目录 1 前言2 游戏截图3 源代码 1 前言 本文介绍的是我空闲时间用C语言写的一个俄罗斯方块游戏,整个程序只有一个文件,实现了基本的游戏功能,但还是有些缺陷,希望有心之士能够继续完善,感谢各位! 2 游戏…

【大数据基础平台】星环TDH社区集群版本部署

🦄 个人主页——🎐开着拖拉机回家_大数据运维-CSDN博客 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁&#x1f…

Spring-Spring 之底层架构核心概念解析

BeanDefinition BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。比如: class,表示Bean类型scope,表示Bean作用域,单例或原型等lazyInit:表示Bean是否是懒加载initMeth…

【云备份|| 日志 day3】服务端配置信息模块

云备份day3 使用文件配置加载一些程序的运行关键信息可以让程序的运行更加灵活,且当需要修改部分内容时,不需要在代码上修改,只需要修改配置文件,然后重启服务器即可。 配置信息 热点判断时间文件下载URL前缀路径压缩包后缀名称…

模电学习路径

交流通路实质 列出电路方程1,方程1对时刻t做微分 所得方程1‘ 即为 交流通路 方程1对时刻t做微分:两个不同时刻的方程1相减,并 令两时刻差为 无穷小 微分 改成 差 模电学习路径: 理论 《电路原理》清华大学 于歆杰 朱桂萍 陆文…

学习 SpringMVC 必备的 4 大知识点

一、什么是 SpringMVC 前面我们了解了Spring、SpringBoot,那么 Spring MVC 又是什么呢?关于三者,我们可以这样理解:Spring MVC 是 Spring 框架的核心模块,而 Spring Boot 是 Spring 的脚手架。 Spring MVC 又称作 Sp…

【特殊矩阵的压缩存储】

文章目录 特殊矩阵的压缩存储特殊的矩阵 特殊矩阵的压缩存储 矩阵:一个由m x n个元素排成的m行n列的表。 矩阵的常规存储: 将矩阵描述为一个二维数组。 矩阵的常规存储的特点: 可以将元素进行随机存取; 矩阵运算非常简单&#xf…

linux查看文件夹使用情况以及查看文件大小

1、ls ls 命令是 Linux 中最常用的文件和目录列表命令之一。它可以显示文件的各种属性&#xff0c;包括文件大小。 ls -l <文件名>上述命令会显示文件的详细信息&#xff0c;其中包括文件的大小。文件大小以字节为单位显示&#xff0c;并且在输出中的第 5 列。4096 表示…

我做云原生的那几年

背景介绍 在2020年6月&#xff0c;我加入了一家拥有超过500人的企业。彼时&#xff0c;前端团队人数众多&#xff0c;有二三十名成员。在这样的大团队中&#xff0c;每个人都要寻找自己的独特之处和核心竞争力。否则&#xff0c;你可能会沉没于常规的增删改查工作中&#xff0…

【C++】C++11【下】lambda表达式|thread线程库

目录 1、lambda表达式 1.1 lambda表达式的引入 1.2 lambda表达式的语法 1.3 lambda表达式的原理 2、线程库 2.1thread类的介绍 2.2 线程函数参数 2.3 原子性操作库(atomic) 2.4 使用场景 应用场景1&#xff1a; 应用场景2: 应用场景3&#xff1a; 应用场景4&#xf…

在Qt中解决opencv的putText函数无法绘制中文的一种解决方法

文章目录 1.问题2.查阅资料3.解决办法 1.问题 在opencv中&#xff0c;假如直接使用putText绘制中文&#xff0c;会在图像上出现问号&#xff0c;如下图所示&#xff1a; 2.查阅资料 查了一些资料&#xff0c;说想要解决这个问题&#xff0c;需要用到freetype库或者用opencv…

Java--多线程--Thread类+Runnable接口

1.多进程与多线程 1.1多进程&#xff1a; 一个进程是一个包含自身地址的程序&#xff0c;每个独立执行的程序都称为进程&#xff0c;也就是正在执行的程序&#xff0c;系统可以分配给每个进程一段有限的使用CPU的时间&#xff08;CPU时间片&#xff09;&#xff0c;CPU在这个时…