Qt creator实现一个简单计算器
目录
1 界面设计
2 思路简介
3 代码
目录
1 界面设计
2 思路简介
3 代码
3.1 widget.h
3.2 widget.c
4 完整代码
在这里主要记载了如何使用Qt creator完成一个计算器的功能。该计算器可以实现正常的加减乘除以及括号操作,能实现简单的计算器功能。
1 界面设计
该计算器的界面设计如下所示:
2 思路简介
1. 中缀表达式的构建
将按键输入字符转换为字符串的形式。
比如:中缀表达式3+2+34+(6-3*5);
那么可以定义一个字符数组char Chars[1024];存储,之后使用QString::fromUtf8(this->Chars);将该字符数组转换为LineEdit可以显示的类型。
2. 中缀表达式转变为后缀表达式
直接按照字符将中缀转变为后缀表达式,在进行计算时,再转换为数据和符号。这里在将中缀表达式转变为后缀表达式时,把每个数都使用&进行分割,方便后续计算。比如32+21转换为后缀表达式就是32&&21+。
3. 使用后缀表达式进行计算
3 代码
3.1 widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void Fb_Change(); // 中缀转换为后缀表达式void Clear();
public:int i,j;private slots:void on_but_one_clicked();void on_but_zero_clicked();void on_but_two_clicked();void on_but_three_clicked();void on_but_four_clicked();void on_but_five_clicked();void on_but_six_clicked();void on_but_seven_clicked();void on_but_eight_clicked();void on_but_nine_clicked();void on_but_add_clicked();void on_but_sub_clicked();void on_but_mul_clicked();void on_but_div_clicked();void on_but_leftbrk_clicked();void on_but_rightbrk_clicked();void on_but_cls_clicked();void on_but_bit_clicked();void on_but_eql_clicked();void on_but_close_clicked();private:Ui::Widget *ui;int Data[128]; // data stackchar suffix[128]; // 后缀表达式 stackchar sign[128]; // 符号栈char Chars[1024]; // zhong缀表达式字符数组int data_sp = 0; // 数据栈顶指针int suffix_sp = 0; // 后缀栈顶指针int sign_sp = 0; // 符号栈顶指针int char_sp = 0; //int Operation_end = 0; // 运算结束标志位,1:运算结束
};
#endif // WIDGET_H
3.2 widget.c
#include "widget.h"
#include "ui_widget.h"
#include "qdebug.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_but_one_clicked()
{this->Chars[char_sp++] = '1';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_zero_clicked()
{this->Chars[char_sp++] = '0';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_two_clicked()
{this->Chars[char_sp++] = '2';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_three_clicked()
{this->Chars[char_sp++] = '3';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_four_clicked()
{this->Chars[char_sp++] = '4';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_five_clicked()
{this->Chars[char_sp++] = '5';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_six_clicked()
{this->Chars[char_sp++] = '6';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_seven_clicked()
{this->Chars[char_sp++] = '7';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_eight_clicked()
{this->Chars[char_sp++] = '8';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_nine_clicked()
{this->Chars[char_sp++] = '9';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_add_clicked()
{this->Chars[char_sp++] = '+';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_sub_clicked()
{this->Chars[char_sp++] = '-';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_mul_clicked()
{this->Chars[char_sp++] = '*';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_div_clicked()
{this->Chars[char_sp++] = '/';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_leftbrk_clicked()
{this->Chars[char_sp++] = '(';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_rightbrk_clicked()
{this->Chars[char_sp++] = ')';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_cls_clicked()
{Clear();
}void Widget::on_but_bit_clicked()
{if(Operation_end == 0) // 没有运算结束{this->Chars[--char_sp] = ' ';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));}else {// 运算结束Clear();}
}void Widget::on_but_eql_clicked()
{Fb_Change();
}
void Widget::Clear()
{this->char_sp = 0;ui->lineEdit->clear();for(i=0; i<sign_sp; i++){this->sign[i] = ' ';}sign[0] ='\0';this->sign_sp = 0;for(i=0; i<suffix_sp; i++){this->suffix[i] = ' ';}this->suffix_sp = 0;suffix[0] ='\0';for(i=0; i<data_sp; i++){this->Data[i] = 0;}this->data_sp = 0;Operation_end = 0; // 运算结束标志位
}// 中缀转换为后缀表达式
void Widget::Fb_Change()
{int font=0;int flag = 0;i = char_sp;j = 0;int count = 0;// 12*4+34/5-(56=67*4)+32 => 12 4 * 34 5 / 56 67 4 * + - 32 + +qDebug() << "1";while(i--) // 总共字符个数{if(isdigit(this->Chars[j])) // 如果是数字字符{if(flag == 0){suffix[suffix_sp++] = this->Chars[j]; // !j++;}else{suffix[suffix_sp++] = '&'; // 主要是为了正确分割数据, 和flag配合suffix[suffix_sp++] = this->Chars[j]; // !j++;flag = 0;}continue;}if((sign_sp == 0 || sign[sign_sp-1] == '(') && this->Chars[j] != ')') // 如果符hao栈为空或者栈顶元素为'('{qDebug() << "null" <<endl;suffix[suffix_sp++] = '&'; // 主要是为了正确分割数据, 和flag配合sign[sign_sp++] = this->Chars[j]; // !j++;flag = 1; // 主要是为了正确分割数据continue;}//if((this->Chars[j] == '*' || this->Chars[j] == '/') && (sign[sign_sp-1] == '-' || sign[sign_sp-1] == '+')){sign[sign_sp++] = this->Chars[j]; // !j++;flag = 1; //continue;}if((this->Chars[j] == '*' || this->Chars[j] == '/') && (sign[sign_sp-1] == '*' || sign[sign_sp-1] == '/')){suffix[suffix_sp++] = '&'; // 主要是为了正确分割数据, 和flag配合suffix[suffix_sp++] = sign[--sign_sp];sign[sign_sp++] = this->Chars[j];j++;flag = 1; // 主要是为了正确分割数据continue;}if(this->Chars[j] == '+' || this->Chars[j] == '-'){suffix[suffix_sp++] = '&'; // 主要是为了正确分割数据, 和flag配合suffix[suffix_sp++] = sign[--sign_sp];sign[sign_sp++] = this->Chars[j];j++;flag = 1; //continue;}if(this->Chars[j] == '('){sign[sign_sp++] = this->Chars[j]; // !j++;flag = 1; //continue;}if(this->Chars[j] == ')'){while(sign[--sign_sp] != '('){suffix[suffix_sp++] = '&'; // 主要是为了正确分割数据, 和flag配合suffix[suffix_sp++] = sign[sign_sp];}sign[sign_sp] = ' ';j++;flag = 1; //continue;}}while(sign_sp--){suffix[suffix_sp++] = sign[sign_sp];}suffix[suffix_sp] = '\0';qDebug()<< suffix;// suffix computeint arg_01, arg_02;for(i=0; i < suffix_sp; i++){if(suffix[i] >= '0' && suffix[i] <= '9'){font = font*count*10 + ((int)suffix[i] - 48); // 252count = 1;continue;}if(suffix[i] == '&'){if(count == 1) // 说明取过数{Data[data_sp++] = font;font = 0;}count = 0;continue;}if(suffix[i] == '+'){if(count == 1) // 说明取过数{Data[data_sp++] = font;font = 0;}arg_01 = Data[--data_sp]; //arg_02 = Data[--data_sp]; //Data[data_sp++] = arg_01+arg_02;qDebug() << Data[data_sp - 1];count = 0;continue;}if(suffix[i] == '-'){if(count == 1) // 说明取过数{Data[data_sp++] = font;font = 0;}arg_01 = Data[--data_sp]; //arg_02 = Data[--data_sp]; //Data[data_sp++] = arg_02 - arg_01;count = 0;continue;}if(suffix[i] == '*'){if(count == 1) // 说明取过数{Data[data_sp++] = font;font = 0;}arg_01 = Data[--data_sp]; //arg_02 = Data[--data_sp]; //Data[data_sp++] = arg_01 * arg_02;count = 0;continue;}if(suffix[i] == '/'){if(count == 1) // 说明取过数{Data[data_sp++] = font;font = 0;}arg_01 = Data[--data_sp]; //arg_02 = Data[--data_sp]; //Data[data_sp++] = arg_02 / arg_01;count = 0;continue;}}qDebug() << Data[0];ui->lineEdit->clear();this->Chars[char_sp++] = '=';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars)+QString::number(Data[0]));Operation_end = 1; // 运算结束标志位}
// 237 238 236void Widget::on_but_close_clicked()
{this->close(); // close window
}
4 完整代码
https://download.csdn.net/download/qq_51458770/89492760
相关文章:
Qt creator实现一个简单计算器
目录 1 界面设计 2 思路简介 3 代码 目录 1 界面设计 2 思路简介 3 代码 3.1 widget.h 3.2 widget.c 4 完整代码 在这里主要记载了如何使用Qt creator完成一个计算器的功能。该计算器可以实现正常的加减乘除以及括号操作,能实现简单的计算器功能。 1 界…...
Java代码基础算法练习-计算被 3 或 5 整除数之和-2024.06.29
任务描述: 计算 1 到 n 之间能够被 3 或者 5 整除的数之和。 解决思路: 输入的数字为 for 循环总次数,每次循环就以当前的 i 进行 3、5 的取余操作,都成立计入总数sum中,循环结束,输出 sum 的值 代码示例&…...
Socket编程详解(二)核心代码讲解
本文对代码的讲解基于上一篇博客 快速链接 Socket编程详解(一)服务端与客户端的双向对话 小试牛刀1:委托声明的关键字和委托方法使用的方法名是不一样的名称 可读性:有时,委托的名称可能描述了它的用途或它在哪里被…...
(项目实战)聚合支付系统开发环境搭建-基于VMware17安装Centos7.9
1 开发环境介绍 dtpay聚合支付系统和ecard预付卡系统,服务端部署在Linux环境。后续的开发环境,生产环境都是基于Linux进行搭建,系统使用到的相关中间件(RocketMQ,Redis,Nginx等),配置中心Nacos,数据库MySQ…...
Python现在可以在线编程了!
你好,我是郭震 1 在线编程 在线编程好处: 1 无需安装和配置环境: 在线编程平台不需要用户在本地安装任何软件或配置开发环境。这对初学者和那些希望快速上手进行编程的人非常有利。 2 跨平台兼容性: 这些平台可以在任何具有互联网连接的设备上使用&#…...
ThreadPoolExecutor线程池创建线程
线程池介绍 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源&#…...
畅谈GPT-5
前言 ChatGBT(Chat Generative Bidirectional Transformer)是一种基于自然语言处理技术的对话系统,它的出现是人工智能和自然语言处理技术发展的必然趋势。随着技术的更新和进步,GPT也迎来了一代代的更新迭代。 1.GPT的回顾 1.1 GPT-3的介绍 GPT-3(Gen…...
石家庄高校大学智能制造实验室数字孪生可视化系统平台项目验收
智能制造作为未来制造业的发展方向,已成为各国竞相发展的重点领域。石家庄高校大学智能制造实验室积极响应国家发展战略,结合自身优势,决定引进数字孪生技术,构建一个集教学、科研、生产于一体的可视化系统平台。 数字孪生可视化…...
WLAN 4-Way Handshake如何生成GTK?
关于Wi-Fi的加密认证过程,可以参考如下链接,今天我们来理解如何生成GTK。 WLAN数据加密机制_tls加密wifi-CSDN博客 1 GTK GTK(Group Temporal Key)是由AP通过GMK生成,长度为128位,并在四次握手的第三步中…...
Qt/C++模拟鼠标键盘输入
1、控制鼠标移动 (1)Qt方案 QScreen* sc QGuiApplication::primaryScreen(); QCursor* c new QCursor(); int deltaX 10; int deltaY 10; c->setPos(sc, c->pos().x() deltaX, c->pos().y() deltaY);(2)Windows原…...
OpenGL3.3_C++_Windows(22)
材质: 决定物体在渲染过程中最终视觉呈现的关键因素之一,它通过一系列光学(投光物)和物理参数(反光度,反照率、金属度,折射率……)准确模拟现实世界中的材料特性,从而增…...
electron-builder 打包过慢解决
报错内容如下 > 6-241.0.0 build > electron-builder • electron-builder version24.13.3 os10.0.22631 • loaded configuration filepackage.json ("build" field) • writing effective config filedist\builder-effective-config.yaml • pack…...
leetcode226反转二叉树
本文主要讲解反转二叉树的要点与细节,按照步骤思考更方便理解 c和java代码如下,末尾 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 具体要点: 1. 首先我们要理解题意, 反转二叉树具体…...
【自然语言处理系列】探索NLP:使用Spacy进行分词、分句、词性标注和命名实体识别,并以《傲慢与偏见》与全球恐怖活动两个实例文本进行分析
本文深入探讨了scaPy库在文本分析和数据可视化方面的应用。首先,我们通过简单的文本处理任务,如分词和分句,来展示scaPy的基本功能。接着,我们利用scaPy的命名实体识别和词性标注功能,分析了Jane Austen的经典小说《傲…...
【Rust】function和methed的区别
文章目录 functionmethedAssociated Functions 参考资料 一句话总结: function和methed很多都是相同的。 不同点在于: methed定义在结构体里面,并且它的第一个参数肯定是self,代表结构体实例。方法需要用实例名.方法名调用当然结…...
python基础语法 003-4 数据类型集合
1 集合 1.1 什么是集合 什么是集合?ANS:集合set是一个无序的不重复元素序列集合怎么表示?ANS: {} , 用逗号隔开打印元组类型,type()一个元素的集合怎么表示?:ANS:存储多种类型{"a", 1} """…...
Vue如何引用组件
在 Vue.js 中,你可以通过几种方式引用组件: 全局注册 在 main.js 或你的主入口文件中,你可以使用 Vue.component() 方法来全局注册一个组件。这意味着这个组件可以在你的 Vue 应用的任何地方使用。 import MyComponent from ./components/…...
vue3中省市区联动在同一个el-form-item中咋么设置rules验证都不为空的效果
在开发中出现如下情况,在同一个el-form-item设置了省市区三级联动的效果 <el-form-item label"地区" prop"extraProperties.Province"><el-row :gutter"20"><el-col :span"12"><el-select v-model&qu…...
如何集成CppCheck到visual studio中
1.CPPCheck安装 在Cppcheck官方网站下载最新版本1.70,官网链接:http://cppcheck.sourceforge.net/ 安装Cppcheck 2.集成步骤 打开VS,菜单栏工具->外部工具->添加,按照下图设置,记得勾选“使用输出窗口” 2.…...
GWO-CNN-SVM,基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)
GWO-CNN-SVM,基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类) 1. GWO灰狼优化算法 灰狼优化算法(Grey Wolf Optimizer, GWO)是一种启发式优化算法,模拟了灰狼群体的社会行为,包…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
