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_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项目,只适合初学者锻炼。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全志F1C200S嵌入式驱动开发(soc系统集成)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 任何一个嵌入式设备都是由很多的子系统组成的。这里面有硬件、有软件,还可能有机械,并不一定就是大家看到的消费电子那样,即一个soc构成了所有的系统。现实情况是,要构建一个系…

网络:从socket编程的角度说明UDP和TCP的关系,http和tcp的区别

尝试从编程的角度解释各种网络协议。 UDP和TCP的关系 从Python的socket编程角度出发&#xff0c;UDP&#xff08;User Datagram Protocol&#xff09;和TCP&#xff08;Transmission Control Protocol&#xff09;是两种不同的传输协议。 TCP是一种面向连接的协议&#xff0c…

SpringBoot3---核心特性---2、Web开发III(模板引擎、国际化、错误处理)

星光下的赶路人star的个人主页 夏天就是吹拂着不可预期的风 文章目录 1、模板引擎1.1 Thymeleaf1.2 基础语法1.3 属性设置1.4 遍历1.5 判断1.6 属性优先级1.7 行内写法1.8 变量选择1.9 模板布局1.10 devtools 2、国家化3、错误处理3.1 默认机制3.2 自定义错误响应3.3 最佳实战 …

nginx+flask+uwsgi部署遇到的坑

文章目录 1.环境&#xff1a;2.uwsgi_conf.ini具体配置内容3.nginx 具体配置4.具体命令(注意使用pip3命令安装)5.服务异常排查 1.环境&#xff1a; centos8 uWSGI 2.0.22 gmssl 3.2.2 nginx version: nginx/1.18.0 项目目录&#xff1a; 2.uwsgi_conf.ini具体配置内容 [uws…

cocos creator 的input.on 不生效

序&#xff1a; 1、执行input.on的时候发现不生效 2、一直按控制台也打印不出来console.log 3、先收藏这篇&#xff0c;因为到时候cocos要开发serveApi的时候&#xff0c;你得选一款趁手的后端开发并且&#xff0c;对习惯用ts写脚本的你来说&#xff0c;node是入门最快&#xf…

IDEA中怎么使用git下载项目到本地,通过URL克隆项目(giteegithub)

点击 新建>来自版本控制的项目 点击后会弹出这样一个窗口 通过URL拉取项目代码 打开你要下载的项目仓库 克隆>复制 gitee github也是一样的 返回IDEA 将刚刚复制的URL粘贴进去选择合适的位置点击克隆 下载完成

深挖 Threads App 帖子布局,我进一步加深了对CSS网格布局的理解

当我遇到一个新产品时&#xff0c;我首先想到的是他们如何实现CSS。当我遇到Meta的Threads时也不例外。我很快就探索了移动应用程序&#xff0c;并注意到我可以在网页上预览公共帖子。 这为我提供了一个深入挖掘的机会。我发现了一些有趣的发现&#xff0c;我将在本文中讨论。 …

24届近5年重庆邮电大学自动化考研院校分析

今天给大家带来的是重庆邮电大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、重庆邮电大学 学校简介 重庆邮电大学简称"重邮"&#xff0c;坐落于直辖市-重庆市&#xff0c;入选国家"中西部高校基础能力建设工程”、国家“卓越工程师教育培养计划…

java的StringBuffer类和StringBuilder类

目录 StringBufferStringBuffer简介StringBuffer类的继承关系StringBuffer类的底层实现创建StringBuffer对象StringBuffer类的常用方法 StringBuilderStringBuilder简介 StringBuffer StringBuffer简介 StringBuffer对象是一个字符序列可变的字符串(String类不可变)。它和Str…

Java中Integer方法

先进行专栏介绍 本专栏是自己学Java的旅途&#xff0c;纯手敲的代码&#xff0c;自己跟着黑马课程学习的&#xff0c;并加入一些自己的理解&#xff0c;对代码和笔记 进行适当修改。希望能对大家能有所帮助&#xff0c;同时也是请大家对我进行监督&#xff0c;对我写的代码进行…

springboot快速整合Memcached缓存技术

目录 Memcached基本介绍 Memcached安装 springboot技术整合 规范化定义配置属性 Memcached基本介绍 memcached是一套分布式的快取系统&#xff0c;与redis相似,当初是Danga Interactive为了LiveJournal所发展的&#xff0c;但被许多软件&#xff08;如MediaWiki&#xff…

道本科技受邀参加建筑产业互联网推动建筑产业现代化体系构建座谈会,以数字化产品为建筑行业注入新动能!

2023年7月底&#xff0c;道本科技作为中国建筑业协会合作伙伴&#xff0c;受邀参加了建筑产业互联网推动建筑产业现代化体系构建座谈会。在这次座谈会上&#xff0c;道本科技旗下产品“合规数”“合同智能审查”和“智合同范本库”被中国建筑&#xff08;中小企业&#xff09;产…

【笔记】第94期-冯永吉-《湖仓集一体关键技术解读》-大数据百家讲坛-厦大数据库实验室主办20221022

https://www.bilibili.com/video/BV1714y1j7AU/?spm_id_from333.337.search-card.all.click&vd_sourcefa36a95b3c3fa4f32dd400f8cabddeaf

后端进阶之路——万字总结Spring Security与数据库集成实践(五)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…

JavaScript-DOM

目录 DOM 访问节点 节点信息 操作节点 DOM DOM&#xff1a;Document Object Model&#xff08; 文档对象模型&#xff09; 访问节点 使用 getElement系列方法访问指定节点 getElementById()、getElementsByName()、getElementsByTagName()根据层次关系访问节点 节点属性 属…

jmeter使用步骤

jmeter 使用步骤 1&#xff0c;进入jmeter目录中的bin目录&#xff0c;双击jmeter.bat 打开 2&#xff0c;右键test plan 创建线程组 3&#xff0c;配置线程组参数 4&#xff0c;右键刚刚创建的线程组&#xff0c;创建请求&#xff0c;填写请求地址 5&#xff0c;需要携带to…

AI让分子“起死回生”:拯救抗生素的新希望

生物工程师利用人工智能(AI)使分子“起死回生”[1]。 为实现这种分子“复活”,研究人员应用计算方法对来自现代人类(智人)和我们早已灭绝的远亲尼安德特人和丹尼索瓦人的蛋白质数据进行分析。这使研究人员能够鉴定出可以杀死致病细菌的分子&#xff0c;从而促进研发用于治疗人类…

11. 使用tomcat中碰到的一些问题

文章目录 问题一&#xff1a;Tomcat的startup.bat启动后出现乱码问题二&#xff1a;一闪而退之端口占用问题三&#xff1a;非端口问题的一闪而退问题四&#xff1a;服务器的乱码和跨域问题问题五: 在tomcat\webapps\下创建文件夹为什么tomcat重启就会丢失问题六&#xff1a;Tom…

大后台,小前台——组合式创新加速推进产教融合

2023年8月1日&#xff0c;由成都知了汇智科技有限公司组织召开的“2023产教融合项目推进闭门研讨会”于成都市高新区软件园G8区7楼正式举行&#xff0c;本次会议基于“产业链的用人需求、资本链的回报诉求、服务链的价值要求、教育链的延伸需求”进行交流探讨&#xff0c;形成稳…

区块链实验室(17) - FISCO BCOS的P2P网络层分析

首先启动FISCO BCOS的示例网络&#xff0c;即4个节点的强连通网络。每个节点与其余3个节点存在网络连接。 打开控制台&#xff0c;可以看到当前有21个区块。 其中1个节点的P2P端口是30301&#xff0c;监测这个节点的端口。 该端口的部分流量见下图所示。白底部分是某1秒钟接收到…