Qt项目---简单的计算器

在这篇技术博客中,我们将介绍如何使用Qt框架实现一个简单的计算器应用。我们将使用C++编程语言和Qt的图形用户界面库来开发这个应用,并展示如何实现基本的算术操作。

 

 项目设置

首先,我们需要在Qt Creator中创建一个新的Qt Widgets应用程序项目。这个项目将提供我们所需的基本框架和文件结构。在创建项目时,我们可以选择包含所需的文件和模板代码,以便更快地开始工作。

选择 Qt Widegets Application

 然后给项目命名

 

然后

 

 后面的选择QWidget

最后一步默认就行了 

 界面设计

我们的计算器应用将包含一个文本框用于显示输入和结果,以及一组按钮用于输入数字和执行算术操作。我们可以使用Qt的界面设计器来设计和布局这些UI元素。界面设计器帮助我们以图形方式布局和排列部件,并为它们添加适当的操作和信号槽连接。

在我们的计算器界面中,我们需要添加一个单行文本框(QLineEdit)用于显示输入和结果。此外,我们将添加数字按钮(QPushButton)和操作按钮(如加法、减法、乘法、除法和等于号按钮)。通过在界面设计器中拖放这些元素,我们可以轻松地设置它们的位置和大小。

 

将界面设计成我这样,上面白色展示计算的地方可以用  lineEdit ,剩下的用PushButton 就行了。

然后快捷的可以鼠标右击,打开转接到槽

 选择第一个clicked()

 

这样在widegt.h ,widegt.cpp都有了写好的槽,我们只需要实先就可以了 

 

事件处理

在widegt.h中声明第一个实现算式运算的数a和第二个实现算术运算的数b

QString a;
QStringList b;
QString c;

widget.h完整代码

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QString>
namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();QString a;QStringList b;QString c;private slots:void on_pushButton_1_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();void on_pushButton_4_clicked();void on_pushButton_5_clicked();void on_pushButton_6_clicked();void on_pushButton_7_clicked();void on_pushButton_8_clicked();void on_pushButton_9_clicked();void on_pushButton_0_clicked();void on_pushButton_add_clicked();void on_pushButton_equit_clicked();void on_pushButton_Sub_clicked();void on_pushButton_Mult_clicked();void on_pushButton_divi_clicked();void on_pushButton_clear_clicked();private:Ui::Widget *ui;
};#endif // WIDGET_H

 

widget.cpp中这样写

 

一旦我们的界面布局完成,我们需要处理按钮的点击事件和执行相应的操作。为此,我们将使用Qt框架提供的信号和槽机制来连接按钮的点击事件和我们实现的槽函数。

对于数字按钮,我们将在其点击事件触发时将相应的数字追加到输入字符串中,并更新文本框的显示。例如,当点击数字按钮"1"时,我们将在输入字符串末尾追加"1"并更新文本框。

对于操作按钮(如加法、减法、乘法、除法和等于号按钮),我们将执行相应的数学运算并更新文本框的显示。例如,当点击加法按钮时,我们将将当前输入字符串保存为第一个操作数,清空输入字符串,并在操作字符串中指定加法操作。

在等于号按钮的点击事件中,我们将解析操作字符串,并根据指定的操作类型执行相应的数学运算。我们完成计算后,将结果更新到输入字符串中,并清空操作字符串,以便进行下一次计算。

void Widget::on_pushButton_1_clicked()
{a += "1"; // 将 '1' 添加到字符串 'a'ui->lineEdit->setText(a); // 将字符串 'a' 的内容设置为文本框的文本
}void Widget::on_pushButton_2_clicked()
{a += "2"; // 将 '2' 添加到字符串 'a'ui->lineEdit->setText(a); // 将字符串 'a' 的内容设置为文本框的文本
}void Widget::on_pushButton_3_clicked()
{a += "3"; // 将 '3' 添加到字符串 'a'ui->lineEdit->setText(a); // 将字符串 'a' 的内容设置为文本框的文本
}void Widget::on_pushButton_4_clicked()
{a += "4"; // 将 '4' 添加到字符串 'a'ui->lineEdit->setText(a); // 将字符串 'a' 的内容设置为文本框的文本
}void Widget::on_pushButton_5_clicked()
{a += "5"; // 将 '5' 添加到字符串 'a'ui->lineEdit->setText(a); // 将字符串 'a' 的内容设置为文本框的文本
}void Widget::on_pushButton_6_clicked()
{a += "6"; // 将 '6' 添加到字符串 'a'ui->lineEdit->setText(a); // 将字符串 'a' 的内容设置为文本框的文本
}void Widget::on_pushButton_7_clicked()
{a += "7"; // 将 '7' 添加到字符串 'a'ui->lineEdit->setText(a); // 将字符串 'a' 的内容设置为文本框的文本
}void Widget::on_pushButton_8_clicked()
{a += "8"; // 将 '8' 添加到字符串 'a'ui->lineEdit->setText(a); // 将字符串 'a' 的内容设置为文本框的文本
}void Widget::on_pushButton_9_clicked()
{a += "9"; // 将 '9' 添加到字符串 'a'ui->lineEdit->setText(a); // 将字符串 'a' 的内容设置为文本框的文本
}void Widget::on_pushButton_0_clicked()
{a += "0"; // 将 '0' 添加到字符串 'a'ui->lineEdit->setText(a); // 将字符串 'a' 的内容设置为文本框的文本
}

代码实现

在Qt Creator中,我们可以打开所生成的模板代码文件并开始实现我们的计算器逻辑。在这里,我们将使用C++编程语言编写我们的槽函数和其他辅助函数。

在我们的Widget类中,我们将定义一个私有变量a和b作为输入和操作字符串。我们还将在Widget的构造函数中连接按钮的点击事件和槽函数,并在析构函数中清理资源。

对于数字按钮的槽函数,我们将在当前输入字符串末尾追加相应的数字,并更新文本框的显示。

对于操作按钮的槽函数,我们将执行以下步骤:
1. 将当前输入字符串保存为第一个操作数。
2. 清空输入字符串。
3. 在操作字符串中指定相应的操作。

对于等于号按钮的槽函数,我们将执行以下步骤:
1. 将当前输入字符串保存为第二个操作数。
2. 解析操作字符串,执行相应的数学运算。
3. 将计算结果更新到输入字符串中,并清空操作字符串。

在清除按钮的槽函数中,我们将清空输入和操作字符串,并将文本框的显示重置为"0"。

代码实现

// 加法按钮被点击
void Widget::on_pushButton_add_clicked()
{b.insert(0,a); // 将字符串a插入到字符串b的首位a.clear(); // 清空字符串ab.insert(1,"+"); // 在字符串b的第1个位置插入"+"符号ui->lineEdit->setText(a); // 将字符串a的内容设置为文本框的文本
}// 等于按钮被点击
void Widget::on_pushButton_equit_clicked()
{if (!a.isEmpty() && !b.isEmpty()) {b.insert(2, a); // 在字符串b的第2个位置插入字符串aint v3;if (b.at(1) == "+") { // 判断字符串b的第1个元素是否为"+"v3 = QString(b.at(0)).toInt() + QString(b.at(2)).toInt(); // 将字符串b的第0个和第2个元素转换为整数,并进行加法运算ui->lineEdit->setText(QString::number(v3)); // 将结果转换为字符串,并将其设置为文本框的文本} else if (b.at(1) == "-") { // 判断字符串b的第1个元素是否为"-"v3 = QString(b.at(0)).toInt() - QString(b.at(2)).toInt(); // 将字符串b的第0个和第2个元素转换为整数,并进行减法运算ui->lineEdit->setText(QString::number(v3)); // 将结果转换为字符串,并将其设置为文本框的文本} else if (b.at(1) == "*") { // 判断字符串b的第1个元素是否为"*"v3 = QString(b.at(0)).toInt() * QString(b.at(2)).toInt(); // 将字符串b的第0个和第2个元素转换为整数,并进行乘法运算ui->lineEdit->setText(QString::number(v3)); // 将结果转换为字符串,并将其设置为文本框的文本} else if (b.at(1) == "/") { // 判断字符串b的第1个元素是否为"/"v3 = QString(b.at(0)).toInt() / QString(b.at(2)).toInt(); // 将字符串b的第0个和第2个元素转换为整数,并进行除法运算ui->lineEdit->setText(QString::number(v3)); // 将结果转换为字符串,并将其设置为文本框的文本}// 清空a和b,同时将结果保存到a,以便后续计算a = QString::number(v3);b.clear();}else {b.insert(0, a); // 将字符串a插入到字符串b的首位a.clear(); // 清空字符串a}
}// 减法按钮被点击
void Widget::on_pushButton_Sub_clicked()
{b.insert(0,a); // 将字符串a插入到字符串b的首位a.clear(); // 清空字符串ab.insert(1,"-"); // 在字符串b的第1个位置插入"-"符号ui->lineEdit->setText(a); // 将字符串a的内容设置为文本框的文本
}// 乘法按钮被点击
void Widget::on_pushButton_Mult_clicked()
{b.insert(0,a); // 将字符串a插入到字符串b的首位a.clear(); // 清空字符串ab.insert(1,"*"); // 在字符串b的第1个位置插入"*"符号ui->lineEdit->setText(a); // 将字符串a的内容设置为文本框的文本
}// 除法按钮被点击
void Widget::on_pushButton_divi_clicked()
{b.insert(0,a); // 将字符串a插入到字符串b的首位a.clear(); // 清空字符串ab.insert(1,"/"); // 在字符串b的第1个位置插入"/"符号ui->lineEdit->setText(a); // 将字符串a的内容设置为文本框的文本
}// 清除键按钮被点击
void Widget::on_pushButton_clear_clicked()
{a.clear(); // 清空字符串ab.clear(); // 清空字符串bui->lineEdit->setText("0"); // 将文本框的文本设置为"0"
}

 

 

结论

通过使用Qt框架和C++编程语言,我们成功地实现了一个简单的计算器应用。我们通过界面设计器设计了应用的用户界面,并使用槽函数和信号槽机制处理用户的输入和操作。这个计算器应用可以执行基本的数学运算,并在文本框中显示结果。

借助Qt的强大功能和易用性,我们可以进一步扩展和改进这个计算器应用,添加更多的功能和操作。我们可以使用Qt提供的其他库和工具来增加应用的性能和可视化效果。最终,这个计算器还有很多不完善的地方如果想修改完完善可以自己试试,这是一个非常简单的Qt项目,只适合初学者锻炼。

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

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

相关文章

【二进制安全】堆漏洞:Double Free原理

参考&#xff1a;https://www.anquanke.com/post/id/241598 次要参考&#xff1a;https://xz.aliyun.com/t/6342 malloc_chunk 的源码如下&#xff1a; struct malloc_chunk { INTERNAL_SIZE_T prev_size; /*前一个chunk的大小*/ INTERNAL_SIZE_T size; /*当前chunk的…

TPlink DDNS 内网穿透?外网访问设置方法

有很多小伙伴都想知道&#xff1a;TPlink路由器怎么设置DDNS内网穿透&#xff1f;今天&#xff0c;小编就给大家分享一下TPlink DDNS 外网访问设置方法&#xff0c;下面是图文教程&#xff0c;帮助新手快速入门DDNS设置。 本文介绍的是云路由器TP-LINK DDNS的设置方法。TP-LIN…

Keil软件添加STC数据包方法

添加数据包方法如下&#xff1a; &#xff08;1&#xff09;首先&#xff0c;打开STC-ISP烧录工具&#xff1b; &#xff08;2&#xff09;点击“Keil仿真设置”&#xff0c;然后点击“添加型号和头文件到Keil中&#xff0c;添加STC仿真器驱动到Keil中”。 &#xff08;3&…

60多行代码仿制B站首页一个好看的卡片效果

文章目录 1、为啥是这个&#xff1f;2、仿制效果3、实现思路4、代码5、查看B站如何实现 1、为啥是这个&#xff1f; 看到Bilibili首页的一个卡片&#xff0c;看着效果很不错&#xff0c;给人很舒适的感觉。一琢磨貌似也不难&#xff0c;甚至只需要一层 div 就可以实现主要框架…

MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容测评

今天给大家带来了 MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容 100 挑战赛 的视频&#xff0c;现在充电头再以文章的形式呈现给大家&#xff0c;让大家更清楚、直白的了解这款笔记本在升级系统后的兼容性如何。 MacBook Pro 16 M1 Max 配置了 140W 的 MagSafe 充电口&…

mybatisJava对象、list和json转换

1. 参考mybatis-plus mybatis Java对象、list和json转换 网上好多不靠谱&#xff0c;参考mybatis-plus中TableField&#xff0c;mybatis中自定义实现 这样不需要对象中属性字符串接收&#xff0c;保存到表中&#xff0c;都是转义字符&#xff0c;使用时还要手动转换为对象或者…

【Opencv入门到项目实战】(四):图像梯度计算|Sobel算子|Scharr算子|Laplacian算子

文章目录 0.引言1. Sobel算子2. Scharr算子3. Laplacian算子 0.引言 在图像处理中&#xff0c;梯度是指图像中像素灰度变化的速率或幅度&#xff0c;我们先来看下面这张图 假设我们想要计算出A点的梯度&#xff0c;我们可以发现A点位于边缘点&#xff0c;A点左边为黑色&#x…

骨传导耳机真不伤耳吗?骨传导耳机有什么好处?

骨传导耳机真不伤耳吗&#xff1f;骨传导耳机有什么好处&#xff1f; 我先来说说骨传导耳机的工作原理吧&#xff0c;骨传导是一种传声方式&#xff0c;声波通过颅骨、颌骨等头部骨头的振动&#xff0c;将声音传到内耳。其实骨传导的现象我们很常见&#xff0c;就像我们平时嗑瓜…

Qt5.13引入QtWebApp的模块后报错: error C2440: “reinterpret_cast”: 无法从“int”转换为“quintptr”

1、开发环境 Win10-64 qt5.13 msvc2015-64bit-release 2、报错 新建一个demo工程。 引入QtWebApp的httpserver、logging、templateengine三个模块后。 直接运行&#xff0c;&#xff0c;此时报错如下&#xff1a; E:\Qt5.13.1\install\5.13.1\msvc2015_64\include\QtCore…

测试工程师的工作

目录 1.何为软件测试工程师&#xff1f; 2.软件测试工程师的职责&#xff1f; 3.为什么要做软件测试&#xff1f; 4.软件测试的前途如何&#xff1f; 5.工具和思维谁更重要&#xff1f; 6.测试和开发相差大吗&#xff1f; 7.成为测试工程师的必备条件 8.测试的分类有哪…

【chrome扩展开发】vue-i18n使用问题及解决方案

记录chrome扩展开发时调用vue-i18n的一些问题和解决方法 环境 vue: ^3.3.4vue-i18n: ^9.2.2vite: ^4.4.8 错误1 Uncaught (in promise) EvalError: Refused to evaluate a string as JavaScript because unsafe-eval is not an allowed source of script in the following Con…

阿里云平台注册及基础使用

首先进入阿里云官网&#xff1a; 阿里云-计算&#xff0c;为了无法计算的价值 点击右上角“登录/注册”&#xff0c;如果没有阿里云账号则需要注册。 注册界面&#xff1a; 注册完成后需要开通物联网平台公共实例&#xff1a; 注册成功后的登录&#xff1a; 同样点击右上角的…

python与深度学习(十四):CNN和IKUN模型二

目录 1. 说明2. IKUN模型的CNN模型测试2.1 导入相关库2.2 加载模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章IKUN模型训练的模型进行测试。…

el-select控制单选还是多选

<el-form :inline"true" :model"form" class"demo-form-inline"><el-form-item><el-select v-model"form.properties_id" placeholder"请选择样品性质" clearable :multiple"multiple_properties"…

Linux 系统编程 开篇/ 文件的打开/创建

从本节开始学习关于Linux系统编程的知识&#xff01; 学习Linux的系统编程有非常多的知识点&#xff0c;在应用层面&#xff0c;很重要的一点就是学习如何“用代码操作文件来实现文件创建&#xff0c;打开&#xff0c;编辑等自动化执行” 那如何自动化实现对文件的创建&#…

GitHub上删除项目后,IDEA分享项目到GitHub提示Remote is already on GitHub

文章目录 一、错误信息二、解决方法1.删除GitHub上的项目2.找到项目里的.git隐藏文件3.找到config文件4.打开config文件&#xff0c;删除[remote "git-test"]及下面两行内容5.继续使用IDEA分享项目到GitHub即可 一、错误信息 二、解决方法 1.删除GitHub上的项目 2.…

整理mongodb文档:collation

文章连接 整理mongodb文档:collation 看前提示 对于mongodb的collation。个人主要用的范围是在createcollection&#xff0c;以及find的时候用&#xff0c;所以本片介绍的时候也是这两个地方入手&#xff0c;对新手个人觉得理解概念就好。不要求强制性掌握&#xff0c;但是要…

Flink CEP(三)pattern动态更新

线上运行的CEP中肯定经常遇到规则变更的情况&#xff0c;如果每次变更时都将任务重启、重新发布是非常不优雅的。尤其在营销或者风控这种对实时性要求比较高的场景&#xff0c;如果规则窗口过长&#xff08;一两个星期&#xff09;&#xff0c;状态过大&#xff0c;就会导致重启…

谈谈新能源技术

目录 1.什么是新能源 2.新能源的发展历程 3.新能源的优势 1.什么是新能源 新能源是指利用自然界可再生资源、无害的高效能资源或者核能等来替代传统能源的能源形式。与传统化石燃料相比&#xff0c;新能源具有更高的可持续性、更低的环境影响和更长久的供应。以下是一些常见的…

C++多线程环境下的单例类对象创建

使用C无锁编程实现多线程下的单例模式 贺志国 2023.8.1 在多线程环境下创建一个类的单例对象&#xff0c;要比单线程环境下要复杂很多。下面介绍在多线程环境下实现单例模式的几种方法。 一、尺寸较小的类单例对象创建 如果待创建的单例类SingletonForMultithread内包含的成…