使用qt实现四则运算计算机项目

这是我们要包含的头文件

#include <QWidget>
#include<QStack>
#include<string.h>
#include<string>

这是我在ui界面创建的计算机基础框架。

接下来要实现按住每个按钮在白框内显示;

因此我们要定义一个QString 类型的变量 

QString expression;

接下来是我对每个按钮的实现

void Widget::on_one_clicked()
{expression+="1";ui->lineEdit->setText(expression);
}void Widget::on_two_clicked()
{expression+="2";ui->lineEdit->setText(expression);
}void Widget::on_three_clicked()
{expression+="3";ui->lineEdit->setText(expression);
}void Widget::on_four_clicked()
{expression+="4";ui->lineEdit->setText(expression);
}void Widget::on_five_clicked()
{expression+="5";ui->lineEdit->setText(expression);
}void Widget::on_six_clicked()
{expression+="6";ui->lineEdit->setText(expression);
}void Widget::on_seven_clicked()
{expression+="7";ui->lineEdit->setText(expression);
}void Widget::on_eight_clicked()
{expression+="8";ui->lineEdit->setText(expression);
}void Widget::on_nine_clicked()
{expression+="9";ui->lineEdit->setText(expression);
}void Widget::on_zero_clicked()
{expression+="0";ui->lineEdit->setText(expression);
}void Widget::on_left_clicked()
{expression+="(";ui->lineEdit->setText(expression);
}void Widget::on_right_clicked()
{expression+=")";ui->lineEdit->setText(expression);
}void Widget::on_cheng_clicked()
{expression+="*";ui->lineEdit->setText(expression);
}void Widget::on_chu_clicked()
{expression+="/";ui->lineEdit->setText(expression);
}void Widget::on_plus_clicked()
{expression+="+";ui->lineEdit->setText(expression);
}void Widget::on_sub_clicked()
{expression+="-";ui->lineEdit->setText(expression);
}

 C键的实现

void Widget::on_clear_clicked()
{expression.clear();ui->lineEdit->clear();
}

先对expression清空,再清空白框。

删除键的实现

void Widget::on_deletebutton_clicked()
{expression.chop(1);ui->lineEdit->setText(expression);
}

使用chop可以吃掉最后一个。

以下是最难的一个件,=键

这里的代码使用了我之前用栈实现四则运算的代码。

char str[128]={0};

 先定义一个char *类型

qstrcpy(str, expression.toUtf8().data());

使用这个可以把QString类型转换为char*类型

以下就是实现步骤

思路就是创建一个操作符栈,数字栈。

如果该操作符的优先级高于栈顶的操作符,则该操作符入栈。

否则栈顶的操作符出栈,并把数字栈的前两个数字出栈运算。

再把结果放入数字栈。

float n1, n2, tmp = 0;int  priority;char op;QStack<float> numS;QStack<char> opS;int mylength=strlen(str);for (int i = 0; i <mylength ; i++){if (str[i] >= '0' && str[i] <= '9'){tmp = tmp * 10 + float(str[i] - '0');}else{numS.push(tmp);priority = getpriority(str[i]);while (!opS.empty() && priority <= getpriority(opS.top())){op = opS.top();opS.pop();n2 = numS.top();numS.pop();n1 = numS.top();numS.pop();n1 = cal_one(n1, op, n2);numS.push(n1);}opS.push(str[i]);tmp = 0;}}// 处理最后一个数字numS.push(tmp);// 计算剩余的表达式while (!opS.empty()){op = opS.top();opS.pop();n2 = numS.top();numS.pop();n1 = numS.top();numS.pop();float result = cal_one(n1, op, n2);numS.push(result);}ui->lineEdit->setText(QString::number(numS.top()));
}int Widget::getpriority(char ch)
{int priority = -1;//-1代表没有找到对应的运算符if (ch == '+' || ch == '-'){priority = 1;}else if(ch=='*'||ch=='/'){priority = 2;}return priority;
}
int Widget::cal_one(float n1, char op, float n2)
{float result = 0;switch (op) {case '+':result = n1 + n2;break;case '-':result = n1 - n2;break;case '*':result = n1 * n2;break;case '/':result = n1 / n2;break;}return result;
}
ui->lineEdit->setText(QString::number(numS.top()));
}

这一步可以把int类型转为QString 类型。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//按钮放图片QIcon con("C:\\Users\\15322\\Pictures\\Screenshots\\tt.PNG");ui->deletebutton->setIcon(con);//ui->equal->setStyleSheet("backgroup:blue");
}

 这一步可以再按钮上放图片。

一下就是结果

 

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

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

相关文章

GaussDB如何创建和管理视图

GaussDB如何创建和管理视图 一、什么是视图 当用户对数据库中的一张或者多张表的某些字段的组合感兴趣&#xff0c;而又不想每次键入这些查询时&#xff0c;用户就可以定义一个视图&#xff0c;以便解决这个问题。 视图与基本表不同&#xff0c;不是物理上实际存在的&#x…

Vue学习计划-Vue2--VueCLi(六)插槽、过渡

写在最前&#xff1a;父组件引用子组件&#xff0c;如何能在应用子组件内容的同时&#xff0c;还能在自定义内容呢&#xff1f; 1. 插槽 作用&#xff1a; 让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件通信的方式&#xff0c;适用于父组件>子组件分…

基础算法(3):排序(3)插入排序

1.插入排序实现 插入排序的工作原理是&#xff1a;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已经排序的序列从后向前扫描&#xff0c;找到位置并插入&#xff0c;类似于平时打扑克牌时&#xff0c;将牌从大到小排列&#xff0c;每次摸到一张牌就插入到正确的位…

弹性搜索引擎Elasticsearch:本地部署与远程访问指南

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装…

柯桥西班牙语里最“好用”的脏话:一些关于cojones的表达

Creo que una de las palabras con ms contextos donde se puede utilizar y que adems pronto es conocida por los estudiantes de espaol es esta que est en el ttulo. 相信标题中的这个单词“cojones”&#xff0c;使用时总是包含很多含义&#xff0c;同时也是西语学习者最…

VBA快速填充缺失数据

实例需求&#xff1a;数据表中F列中存在数据缺失&#xff0c;如下图所示。现需要根据A列中的内容&#xff08;类别&#xff0c;图中C1、C2、B1为不同类别&#xff09;&#xff0c;补充F列数据&#xff0c;已知每个类别中F列存在不少于一个非空单元格&#xff0c;并且其内容相同…

MPC814 DIP4封装交流输入光电晶体管耦合器

晶体管光电耦合器是一种将光信号转换为电信号的器件&#xff0c;其工作原理是通过光电二极管将光信号转换为电流信号&#xff0c;然后经过晶体管放大&#xff0c;输出相应的电压信号&#xff1b;具有高转换效率较高的灵敏度和快速响应等特点。 由工采网代理的MPC814系列结合了两…

Linux 非阻塞网络IO模式

非阻塞网络IO模式介绍 当用户线程发起一个 read 操作后&#xff0c;并不需要等待&#xff0c;而是马上就得到了一个结果。如果结果是一个 error 时&#xff0c;它就知道数据还没有准备好&#xff0c;于是它可以再次发送 read 操作。一旦内核中的数据准备好了&#xff0c;并且又…

Android笔记(十八):面向Compose组件结合Retrofit2和Rxjava3实现网络访问

一、Retrofit2 Square公司推出的Retrofit2库&#xff08;https://square.github.io/retrofit/&#xff09;&#xff0c;改变了网络访问的方式。它实现了网络请求的封装。Retrofit库采用回调处理方式&#xff0c;使得通过接口提交请求和相应的参数的配置&#xff0c;就可以获得…

安装2023最新版Java SE 21.0.1来开发Java应用程序

安装2023最新版Java SE 21.0.1来开发Java应用程序 Install the latest version of Java SE 21.01 to Develop Java Applications By JacksonML 本文简要介绍如何下载和安装2023年最新版Java Development Kit (简称JDK&#xff0c;即Java开发工具包标准版&#xff09;21.0.1&…

开发人员必须掌握的几个高级命令

xargs命令 在平时的使用中,我认为 xargs 这个命令还是较为重要和方便的。我们可以通过使用这个命令,将命令输出的结果作为参数传递给另一个命令。 比如说我们想找出某个路径下以 .conf 结尾的文件,并将这些文件进行分类,那么普通的做法就是先将以 .conf 结尾的文件先找出…

通过51单片机控制SG90舵机按角度正反转转动

一、前言 本文介绍如何通过51单片机控制SG90舵机实现角度的正反转转动。SG90舵机是一种常用的微型舵机&#xff0c;具有体积小、重量轻、结构简单等特点&#xff0c;被广泛应用于机器人、遥控模型和各种自动控制系统中。 使用51单片机&#xff08;STC89C52&#xff09;作为控…