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)是一种启发式优化算法,模拟了灰狼群体的社会行为,包…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...