QT简易加法计算器项目实现

news2024/10/7 19:17:41

完整代码见GitHub:点击进入

在该项目中,使用了三个文件,分别是CalculatorDialog.h, CalculatorDialog.cpp, main.cpp

  • CalculatorDialog.h:在该头文件里定义了一些成员变量和槽函数,用于实现计算器基本功能。
  • CalculatorDialog.cpp:CalculatorDialog类的构造函数,用于初始化计算器对话框界面和控件。
  • main.cpp:Qt应用程序的入口。

CalculatorDialog.h

1. 在这个文件中首先使用了#ifndef#define,用于防止头文件被重复包含,如果头文件已经被包含,则__CALCULATORDIALOG_H宏将已经被定义,#ifndef指令将会跳过后续的代码。

#ifndef __CALCULATORDIALOG_H
#define __CALCULATORDIALOG_H


#endif // __CALCULATORDIALOG_H

2. 加入了一些#include头文件,这些头文件包含Qt框架提供的头文件,例如本程序中的#include。

#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit> // 行编辑控件
#include <QHBoxLayout> // 水平布局器
#include <QDoubleValidator> // 验证器
  • #include <QDialog>:Qt中的对话框类,用于创建一个窗口化的用户界面。
  • #include <QLabel>:Qt中的标签类,用于显示文本或图像等静态信息。
  • #include <QPushButton>:Qt中的按钮类,用于触发动作或操作。
  • #include <QLineEdit>:Qt中的行编辑类,用于行输入和编辑文本。
  • #include <QHBoxLayout>:Qt中的水平布局器类,用于自动将控件按照水平方向排列。
  • #include <QDoubleValidator>:Qt中的验证器类,用于验证输入数据是否为合法数据。

3. 定义了一个CalculatorDialog类,并且继承于QDialog,这个类可以理解为计算器对话框。

class CalculatorDialog:public QDialog {

};

4. 定义了一个构造函数

  • CalculatorDialog(void):用于初始化界面和控件。

5. 定义了两个槽函数:

  • void enableButton(void):用于检查左右操作数是否有输入,有输入就启用等于按钮。
  • void calcClicked(void):用于计算左右操作数的和并将结果在输出框中显示
public:
	CalculatorDialog(void);
public slots:
	// 使能等号按钮的槽操作数
	void enableButton(void);
	// 计算结果和显示的槽函数
	void calcClicked(void);

6. 定义了五个指针:

  • QLineEdit* m_editX:指向左操作数的指针
  • QLineEdit* m_editY:指向右操作数的指针
  • QLineEdit* m_editZ:指向结果输出框的指针
  • QLabel* m_label:指向“+”标签的指针
  • QPushButton* m_button:指向“=”按钮的指针
private:
	QLineEdit* m_editX; // 左操作数
	QLineEdit* m_editY; // 右操作数
	QLineEdit* m_editZ; // 显示结果
	QLabel* m_label; // "+"
	QPushButton* m_button; // "="

7. 定义了一个Q_OBJECT宏,用于QT元对象编译器(moc)自动生成代码,以支持Qt的信号和槽机制。(是QT信号和槽的必要条件)

	Q_OBJECT // moc

完整代码见GitHub。

CalculatorDialog.cpp

1. 在该文件中CalculatorDialog类中的构造函数和两个槽函数enableButton()calcClicked(),并且定义了头文件#include "CalculatorDialog.h"。

#include "CalculatorDialog.h"

// 构造函数
CalculatorDialog::CalculatorDialog(void) {

}

// 使能等号按钮的槽操作数
void CalculatorDialog::enableButton(void) {

}

// 计算结果和显示的槽函数
void CalculatorDialog::calcClicked(void) {

}

实现构造函数CalculatorDialog::CalculatorDialog(void)。

2. 设置窗口标题(这个可有可无咯。

	setWindowTitle("加法计算器"); // 设置窗口标题

3. 对左操作数分别进行创建对象,文本右对齐和验证数据是否合法操作,右操作数同样如此。

	// 左操作数, this即为当前父窗口指针
	m_editX = new QLineEdit(this);
	// 设置文本对齐:右对齐
	m_editX->setAlignment(Qt::AlignRight);
	// 设置数字验证器	
	m_editX->setValidator(new QDoubleValidator(this));
	// 右操作数
	m_editY = new QLineEdit(this);
	m_editY->setAlignment(Qt::AlignRight);
	m_editY->setValidator(new QDoubleValidator(this));

4. 对结果操作数则分别进行创建对象,文本右对齐和显示结果操作。

	// 显示结果
	m_editZ = new QLineEdit(this);
	m_editZ->setAlignment(Qt::AlignRight);
	m_editZ->setReadOnly(true);

5. 分别创建“+”和“=”对象,并且将“=”按钮设置为禁用(在没有输入数据之前,设置为禁用)。

	// "+"
	m_label = new QLabel("+", this);

	// "="
	m_button = new QPushButton("=", this);
	m_button->setEnabled(false);

6. 创建布局器,并让这些对象自动调整位置和大小。

	// 创建布局器:自动调整每个控件大小位置
	QHBoxLayout* layout = new QHBoxLayout(this);
	// 按水平方向,依次将控件添加到布局器中
	layout->addWidget(m_editX);
	layout->addWidget(m_label);
	layout->addWidget(m_editY);
	layout->addWidget(m_button);
	layout->addWidget(m_editZ);
	// 设置布局器
	setLayout(layout);

7. 信号和槽连接,使得左右操作数文本改变时发送信号textChanged(),点击按钮,发送信号clicked()。

	// 信号和槽函数连接
	// 左右操作数文本改变时,发送信号textChanged()
	connect(m_editX, SIGNAL(textChanged(QString)),
		this, SLOT(enableButton(void)));
	connect(m_editY, SIGNAL(textChanged(QString)),
        this, SLOT(enableButton(void)));
	// 点击按钮,发送信号clicked
	connect(m_button, SIGNAL(clicked(void)), 
		this, SLOT(calcClicked(void)));

实现槽函数void CalculatorDialog::enableButton(void),两个左右操作数改变时,发送信号textChanged给该函数。

8. 定义两个bool类型,用来判断左右两个操作数文本是否改变,若改变,使等号按钮开启。

	bool bXok, bYok;
	// text():获取输入文本(QString)
	// toDouble():QString转换为double, 参数保存转为是否成功结果
	m_editX->text().toDouble(&bXok);
	m_editX->text().toDouble(&bYok);
	// 当左右操作数都输入了有效数据,则使能等号按钮,否则设置禁用
	m_button->setEnabled(bXok && bYok);

实现槽函数void CalculatorDialog::calcClicked(void),按钮点击时,发送信号clicked()给该函数。

9. 计算结果并显示数据。

	double res = m_editX->text().toDouble() + m_editY->text().toDouble();
	// number():将double转换为QString
	QString str = QString::number(res);
	// 显示字符串形式结果
	m_editZ->setText(str);

完整代码见GitHub。

main.cpp

该文件是程序的入口

1. 定义了头文件#include <QApplication>,是一个Qt库中的核心类,它封装了整个应用程序的控制对象,在Qt应用程序中,通常需要创建一个QApplication对象,作为程序的主要控制对象,然后在这个对象上执行各种操作,所以需要定义这个头文件。还有CalculatorDialog类的头文件不用多说。

#include <QApplication>
#include "CalculatorDialog.h"

2. int main主函数,并且创建一个QApplication对象作为整个程序的控制对象,最后return app.exec():启动Qt库的事件循环,并等待用户输入和系统事件的发生。

int main(int argc, char** argv) {
	QApplication app(argc, argv);

	return app.exec();

}

3. 创建一个CalculatorDialog对象,即计算器对话框窗口,并将计算器对话框窗口显示出来。

	CalculatorDialog calc;
	calc.show();

完整代码见GitHub。

开始编译qt程序:

  • qmake -project:生成Qt项目文件
  • 就需要在项目文件(.pro文件)中添加QT += widgets这一行。
  • qmake
  • make

成功得到计算器的程序了。 

本次实验结束,欢迎在评论区反馈结果!!!

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

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

相关文章

Springboot的自动装配解读

目录 1.Springboot的自动装配 1.1 组件装配 1.1.1 组件 1.2 Spring Framework 的模块装配 1.2.1 Import注解 1.2.2 BeanDefinition 1.3 Spring Framework 的条件装配 1.3.1 Profile 1.3.2 Conditional 1.3.3 MetaData元数据接口&#xff08;补充&#xff09; Annot…

4、离线数仓数据同步策略(全量表数据同步、增量表数据同步、首日同步、采集通道脚本)

1、离线数仓同步数据 1.1 用户行为数据同步 1.1.1 数据通道 用户行为数据由Flume从Kafka直接同步到HDFS&#xff0c;由于离线数仓采用Hive的分区表按天统计&#xff0c;所以目标路径要包含一层日期。具体数据流向如下图所示。 1.1.2 日志消费Flume配置概述 按照规划&…

【选择排序】手撕八大排序之直接选择排序和堆排序

目录 一.选择排序 1.直接选择排序 2.堆排序 一.选择排序 1.直接选择排序 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的基本思想是每次遍历找到最小&#xff08;或最大&#xff09;的元素&#xff0c;然后将其放置在已排序序列的末尾。在…

实操接口自动化测试项目之项分层设计

本文以笔者当前使用的自动化测试项目为例&#xff0c;浅谈分层设计的思路&#xff0c;不涉及到具体的代码细节和某个框架的实现原理&#xff0c;重点关注在分层前后的使用对比&#xff0c;可能会以一些伪代码为例来说明举例。 接口测试三要素&#xff1a; 参数构造发起请求&a…

JS 1.如何实现继承 2.原型和原型链

1_使用class实现继承 /** 继承 */ class Person { constructor(name) { this.name name;}drink() { console.log(喝水)} }class Student extends Person{ constructor(name, score) { // new Personsuper(name);this.score score;}introduce() { console.log(我是${this.nam…

EasyCVR播放设备录像出现部分视频不能播放的原因排查与解决

EasyCVR视频融合平台基于云边端协同架构&#xff0c;具有强大的数据接入、处理及分发能力。平台支持多协议接入&#xff0c;包括&#xff1a;国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等&#xff0c;对外可分发多格式视频流&#xff0c;包括RTSP、…

栈和队列(二) 队列的实现,用栈实现队列,用队列实现栈,设计循环队列

文章目录 队列的实现用队列实现栈用栈实现队列设计循环队列 队列的实现 这里的队列我们使用链式队列&#xff0c;好处就是可以很方便的取出队头的元素。 使用顺序队列取出队头元素所花费的时间复杂度为O&#xff08;N&#xff09;&#xff0c;把后面的元素向前移动一个下标所花…

CentOS Linux的最佳替代方案(二)_AlmaLinux OS 8.6基础安装教程

文章目录 CentOS Linux的最佳替代方案&#xff08;二&#xff09;_AlmaLinux OS 8.6基础安装教程一 AlmaLinux介绍和发展历史二 AlmaLinux基础安装2.1 下载地址2.2 安装过程 三 AlmaLinux使用3.1 关闭selinux/firewalld3.2 替换默认源3.3 安装一些必要工具 CentOS Linux的最佳替…

瓶盖扫码回收APP系统 废旧物品创造价值收益

资源回收再利用是近些年国家大力倡导的&#xff0c;人们也在积极践行&#xff0c;从垃圾回收、废旧衣物回收、烟盒回收等等.....今天小白要带大家了解的是瓶盖回收APP软件开发的相关事项。瓶盖回收APP是本着资源回收的初衷&#xff0c;可以时间废旧瓶盖的多次利用&#xff0c;减…

使用Xshell服务器跑程序,用pycharm连接服务器远程开发

目标&#xff1a; 1.使用Xshell在服务器上创建自己项目需要的虚拟环境 2.用pycharm实现远程服务器的连接&#xff08;这样就可以在本地debug或者写代码&#xff0c;然后再用xshell在服务器上跑&#xff09; 一、使用Xshell在服务器上创建自己项目需要的虚拟环境 1.打开Xshe…

工具系列之wireshark使用说明

简介 工具下载&#xff1a; https://www.wireshark.org/官方FAQ: https://www.wireshark.org/faq.html 过滤器设置 通常情况下&#xff0c;将.pcap 数据拖拽至 wireshark中即可打开。通过&#xff1a; 导航栏–》分析 --> 显示过滤器 即可找到对应的筛选器&#xff0c;筛…

美格智能发布高性价比5G RedCap CPE解决方案SRT835,加速5G FWA商业落地

6月30日&#xff0c;在MWC 2023上海5G未来峰会上&#xff0c;美格智能重磅发布高性价比轻量化5G RedCap&#xff08;也称作NR-Light&#xff09;CPE解决方案SRT835。该方案搭载骁龙X35调制解调器及射频系统和WCN6856高速Wi-Fi 6解决方案&#xff0c;通过精简系统架构&#xff0…

【技术教程】H.265网页流媒体播放器EasyPlayer无感知播放体验优化

EasyPlayer是我们流媒体组件系列中关注度较高的产品&#xff0c;经过多年的发展和迭代&#xff0c;目前已经有多个应用版本&#xff0c;包括RTSP版、RTMP版、Pro版&#xff0c;以及js版&#xff0c;其中js版本作为网页播放器&#xff0c;受到了用户的广泛使用。 目前我们所有的…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第十天 10/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

初探 C++ 标准库

有趣的重载 重载左移操作符&#xff0c;将变量或常量左移到一个对象中&#xff01; C 标准库 C 标准库并不是 C 语言的一部分 C 标准库是由类库和函数库组成的集合 C 标准库中定义的类和对象都位于 std 命名空间中 C 标准库的头文件都不带 .h 后缀 C 标准库涵盖了 C 库的功…

优思学院|什么是六西格玛黑带?

六西格玛黑带&#xff0c;这是一个有趣的称谓。这个称号意味着拥有它的人在六西格玛方法和统计工具应用方面有很高的造诣。在企业中&#xff0c;只有中层以上的人才能获得这个称号。 黑带这个词源自跆拳道&#xff0c;因为跆拳道最高段位的人所戴的腰带是黑色的。后来&#xf…

『赠书活动 | 第十三期』《算力经济:从超级计算到云计算》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十三期』 本期书籍&#xff1a;《算力经济&#xff1a;从超级计算到云计算》 赠书规则&#xff1a;评论区&#xff1a;点赞&#xff5c;收…

多个el-checkbox-group复选框组 选项互斥

需求 多个el-checkbox-group复选框组 , 组与组之间的选项是互斥的效果效果 代码实现 template <template><div class"page"><el-checkbox-groupv-for"(item, index) in list"v-model"item.checked":key"index"chan…

网络投票链接的制作方法投票制作方法微网络投票

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…

docker-compose部署Minio

一、镜像选择 Minio有很多镜像会有一些bug&#xff0c;而且不好解决&#xff0c;这里使用的是镜像 RELEASE.2021-04-18T19-26-29Z 直接: docker pull minio/minio:RELEASE.2021-04-18T19-26-29Z 即可&#xff1a; 拉取之后可以打个tag&#xff0c;这里是new2 RELEASE.2021…