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

news2025/1/19 11:12:24

在这篇技术博客中,我们将介绍如何使用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_OBJECT

public:
    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(); // 清空字符串a
    b.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个位置插入字符串a
        int 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(); // 清空字符串a
    b.insert(1,"-"); // 在字符串b的第1个位置插入"-"符号
    ui->lineEdit->setText(a); // 将字符串a的内容设置为文本框的文本
}

// 乘法按钮被点击
void Widget::on_pushButton_Mult_clicked()
{
    b.insert(0,a); // 将字符串a插入到字符串b的首位
    a.clear(); // 清空字符串a
    b.insert(1,"*"); // 在字符串b的第1个位置插入"*"符号
    ui->lineEdit->setText(a); // 将字符串a的内容设置为文本框的文本
}

// 除法按钮被点击
void Widget::on_pushButton_divi_clicked()
{
    b.insert(0,a); // 将字符串a插入到字符串b的首位
    a.clear(); // 清空字符串a
    b.insert(1,"/"); // 在字符串b的第1个位置插入"/"符号
    ui->lineEdit->setText(a); // 将字符串a的内容设置为文本框的文本
}

// 清除键按钮被点击
void Widget::on_pushButton_clear_clicked()
{
    a.clear(); // 清空字符串a
    b.clear(); // 清空字符串b
    ui->lineEdit->setText("0"); // 将文本框的文本设置为"0"
}

 

 

结论

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7.物联网操作系统互斥信号量

优先级翻转问题 优先级翻转功能需求 优先级翻转功能实现 一。实验&#xff1a;优先级翻转问题 1.优先级翻转的解释 &#xff08;1&#xff09;有三个任务&#xff0c;一个任务L优先级最低&#xff0c;一个任务M优先级为中间&#xff0c;一个任务H优先级为最高。 &#xff08…

SpringBoot集成企业微信群聊机器人消息

目录 参考文档概述一、功能作用二、应用场景三、 群机器人发送限制四、创建机器人1、添加2、群机器人Webhook地址 五、发送消息1、文本 text请求体 图文连接 news 参考文档 官方文档 企业微信群机器人应用 概述 现在很多企业都在使用企业微信进行工作交流&#xff0c;自从企…

静态路由下一跳地址怎么确定(静态路由配置及讲解)

一、用到的所有命令及功能 ①ip route-static 到达网络地址 子网掩码 下一跳 // 配置静态路由下一跳指的是和当前网络直接连接的路由器的接口地址非直连网段必须全部做路由路径是手工指定的&#xff0c;在大规模网络上不能用&#xff0c;效率低&#xff0c;路径是固定的稳定的…

寻找旋转排序数组中的最小值——力扣153

文章目录 题目描述解法 二分法 题目描述 解法 二分法 int findMin(vector<int>& nums){int l0, rnums.size()-1;while(l<r){int mid (lr)/2;if(nums[mid]<nums[r]) rmid;else lmid1;}return nums[l];}

基于freeRTOS的垃圾桶(cubeMX)

前言&#xff1a;最近学习了freertos的任务、队列、互斥量、任务标志位等理论知识&#xff0c;看着都会就怕一练就废&#xff0c;于是打算做些项目巩固一下&#xff0c;加深一下对freertos知识的理解。 一、项目介绍 项目简单需求&#xff1a; 检测靠近时&#xff0c;垃圾桶自…

APUE学习62章终端(二): stty命令特殊字符终端标志

1. stty命令 stty命令的英文解释: 很明显stty有一个-F参数 所以准确的说: stty命令是设置当前终端驱动程序(也有可能直接配置了硬件&#xff0c;这点目前不清楚)的属性&#xff0c;使当前终端的驱动程序能够使能/去使能一些特殊字符的识别与处理等等 2. stty命令的结构 3. 终端…

Python web实战之 Django 的 ORM 框架详解

本文关键词&#xff1a;Python、Django、ORM。 概要 在 Python Web 开发中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一个非常重要的概念。ORM 框架可以让我们不用编写 SQL 语句&#xff0c;就能够使用对象的方式来操作数据…

总结946

6:40起床 7&#xff1a;15~8:00早读&#xff0c;07年tex1,2 8:10~10:12 880第二章选填&#xff0c;题目有些综合&#xff0c;错的有些多呀&#xff0c;不要紧&#xff0c;拿下它&#xff0c;就有进步了。 10:28~11:27重做强化18讲6道题 12&#xff1a;10~2:15吃饭睡觉&…

MySQL 三大日志日志:undo log、redo log、binlog

目录 一条SQL的执行流程 为什么需要 undo log&#xff1f; undo log 是如何刷盘&#xff08;持久化到磁盘&#xff09;的&#xff1f; 为什么需要 Buffer Pool&#xff1f; Buffer Pool 缓存什么&#xff1f; Undo 页是记录什么&#xff1f; 查询一条记录&#xff0c;就只需…

代码随想录算法训练营第三十二天 | Leetcode随机抽题检测

Leetcode随机抽题检测 46 全排列未看解答自己编写的青春版重点题解的代码日后复习重新编写 78 子集未看解答自己编写的青春版重点题解的代码日后复习重新编写 17 电话号码的字母组合未看解答自己编写的青春版重点题解的代码日后复习重新编写 39 组合总和未看解答自己编写的青春…

SpringBoot项目增加logback日志文件

一、简介 在开发和调试过程中&#xff0c;日志是一项非常重要的工具。它不仅可以帮助我们快速定位和解决问题&#xff0c;还可以记录和监控系统的运行状态。Spring Boot默认提供了一套简单易用且功能强大的日志框架logback&#xff0c;本文将介绍如何在Spring Boot项目中配置和…

使用AIGC工具提升安全工作效率

新钛云服已累计为您分享760篇技术干货 在日常工作中&#xff0c;安全人员可能会涉及各种各样的安全任务&#xff0c;包括但不限于&#xff1a; 开发某些安全工具的插件&#xff0c;满足自己特定的安全需求&#xff1b;自定义github搜索工具&#xff0c;快速查找所需的安全资料、…

HTML基础介绍2

表单格式化 ctrld&#xff1a;复制选中行数的所有代码 ctrlx&#xff1a;删除代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表单综合案例</title> </head> <body> <!--…

(AcWing)01背包问题

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 ii 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数N&#xff0c;V&…

0基础学习VR全景平台篇 第76篇:全景相机-圆周率全景相机如何直播推流

圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅享8K的高清…

【AGI】世界首次实现室温超导LK-99

论文&#xff1a;The First Room-Temperature Ambient-Pressure Superconductor GPT论文总结&#xff1a; 根据所提供的信息&#xff0c;这篇论文报道了一种在室温和常压下工作的室温超导体LK-99。LK-99的超导性是通过微小的结构畸变引起的&#xff0c;而不是通过温度和压力等外…

快速部署外卖系统:利用现代工具简化开发流程

在竞争激烈的外卖市场中&#xff0c;快速部署高效稳定的外卖系统是餐饮企业成功的关键之一。本文将介绍如何利用现代工具简化外卖系统的开发流程&#xff0c;并附带代码示例&#xff0c;帮助开发者快速搭建功能完备、用户友好的外卖平台。 1. 简介 在外卖业务快速增长的背景…

c++编写坦克大战(同年回忆)全网最全的讲解

c编写坦克大战 项目前言 需要熟练的掌握c语言&#xff0c;c。熟练掌握各种数据类型和数据结构。拥有优秀的文档阅读能力&#xff08;设计EasyX图形库的使用&#xff09;&#xff0c;拥有一个漂亮温柔的女朋友。 环境准备 我这里使用的是VS2022,还需要安装EasX图形库。安装教程…

C算法——生成牌 洗牌算法

生成牌 // // Created by Lenovo on 2022-06-11-下午 3:15. // 作者&#xff1a;小象 // 版本&#xff1a;1.0 //#include <stdio.h> #include <time.h> #include <stdlib.h>#define M 1 // 基数 #define N 20 // 洗牌次数 #define TOTAL_NUMS (N - M 1) …

uniapp运行项目到iOS基座

2022年9月&#xff0c;因收到苹果公司警告&#xff0c;目前开发者已无法在iOS真机设备使用未签名的标准基座&#xff0c;所以现在要运行到 IOS &#xff0c;也需要进行签名。 Windows系统&#xff0c;HBuilderX 3.6.20以下版本&#xff0c;无法像MacOSX那样对标准基座进行签名…