【简单】使用ChatGPT和QT从零开始构建一个计算器应用

news2024/12/24 9:26:47

在这篇博文中,我将向大家展示如何使用ChatGPT和Qt来构建一个完整的计算器应用。我们将从零开始,逐步引导您完成整个项目,包括需求分析、软件设计、代码编写等环节。该项目代码全部由GPT编写,10分钟完成。

一,项目概述

本项目旨在使用ChatGPT和Qt技术构建一个功能完备的计算器应用。用户可以执行基本的算术运算,如加、减、乘、除,并且能够在界面上直观地展示输入的数字、运算符以及计算结果。

二,技术栈

在这个项目中,我们将使用以下技术和工具:

  • ChatGPT:作为我们的智能辅助,提供项目开发的指导和解答。
  • Qt 6.2:作为GUI开发框架,用于创建计算器应用的用户界面和交互逻辑。

三,项目实现

1. 需求分析

我们的计算器应用需要具备以下功能:

  • 输入数字
  • 执行加、减、乘、除等算术运算
  • 清除输入
  • 在界面上显示输入的数字、运算符和计算结果

2. 软件设计

根据需求分析,我们将创建两个类:MainWindowCalculator

MainWindow类

  • 成员变量:
    • QLineEdit *m_display:用于显示用户输入的数字、运算符和计算结果。
    • Calculator m_calculator:用于处理计算逻辑的计算器对象。
  • 成员函数:
    • setupUI():创建并设置主窗口的用户界面。
    • connectSignals():连接信号和槽函数,实现用户界面和计

算逻辑之间的交互。

  • onButtonClicked():处理数字按钮和运算符按钮的点击事件。
  • onClearButtonClicked():处理清除按钮的点击事件。
  • onEqualButtonClicked():处理等号按钮的点击事件。

Calculator类

  • 成员变量:
    • QString m_currentInput:当前用户输入的数字或表达式。
    • QString m_operator:当前运算符。
    • double m_firstNumber:第一个操作数。
    • double m_secondNumber:第二个操作数。
    • double m_result:计算结果。
  • 成员函数:
    • inputNumber(const QString &number):将数字输入到当前表达式中。
    • inputOperator(const QString &operatorSymbol):将运算符输入到当前表达式中。
    • calculate():执行计算逻辑,得到计算结果。
    • clear():清除当前输入和计算结果。
    • getCurrentInput() const:获取当前用户输入。
    • getResult() const:获取计算结果。

3. 代码运行结果

在这里插入图片描述

4. 代码编写

开源地址

代码地址https://gitee.com/clcmj/QtProject

代码

calculator.h

#ifndef CALCULATOR_H
#define CALCULATOR_H

#include <QString>

class Calculator {
public:
    Calculator();

    void inputNumber(const QString &number);
    void inputOperator(const QString &operatorSymbol);
    void calculate();
    void clear();

    QString getCurrentInput() const;
    QString getResult() const;

private:
    QString m_currentInput;
    QString m_operator;
    double m_firstNumber;
    double m_secondNumber;
    double m_result;
};

#endif // CALCULATOR_H

calculator.cpp

#include "Calculator.h"

Calculator::Calculator()
    : m_currentInput(""), m_operator(""), m_firstNumber(0), m_secondNumber(0), m_result(0) {}

void Calculator::inputNumber(const QString &number) {
    m_currentInput += number;
}

void Calculator::inputOperator(const QString &operatorSymbol) {
    m_firstNumber = m_currentInput.toDouble();
    m_operator = operatorSymbol;
    m_currentInput.clear();
}

void Calculator::calculate() {
    m_secondNumber = m_currentInput.toDouble();

    if (m_operator == "+") {
        m_result = m_firstNumber + m_secondNumber;
    } else if (m_operator == "-") {
        m_result = m_firstNumber - m_secondNumber;
    } else if (m_operator == "*") {
        m_result = m_firstNumber * m_secondNumber;
    } else if (m_operator == "/") {
        m_result = m_firstNumber / m_secondNumber;
    }
}

void Calculator::clear() {
    m_currentInput.clear();
    m_operator.clear();
    m_firstNumber = 0;
    m_secondNumber = 0;
    m_result = 0;
}

QString Calculator::getCurrentInput() const {
    return m_currentInput;
}

QString Calculator::getResult() const {
    return QString::number(m_result);
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QLineEdit>
#include "Calculator.h"

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);

private slots:
    void onButtonClicked();
    void onClearButtonClicked();
    void onEqualButtonClicked();

private:
    void setupUI();
    void connectSignals();

    QLineEdit *m_display;
    Calculator m_calculator;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "MainWindow.h"
#include <QGridLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent) {
    setupUI();
    connectSignals();
}

void MainWindow::setupUI() {
    QWidget *centralWidget = new QWidget(this);
    QGridLayout *gridLayout = new QGridLayout(centralWidget);

    m_display = new QLineEdit(centralWidget);
    gridLayout->addWidget(m_display, 0, 0, 1, 4);

    QStringList buttons {"7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "C", "0", "=", "+"};

    for (int i = 1; i < 5; ++i) {
        for (int j = 0; j < 4; ++j) {
            QPushButton *button = new QPushButton(buttons[(i - 1) * 4 + j], centralWidget);
            button->setObjectName(buttons[(i - 1) * 4 + j]); // 添加这一行来设置对象名称
            button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
            gridLayout->addWidget(button, i, j);
        }
    }

    centralWidget->setLayout(gridLayout);
    setCentralWidget(centralWidget);
}

void MainWindow::connectSignals() {
    for (auto button : findChildren<QPushButton *>()) {
        if (button->text() == "C") {
            QObject::connect(button, &QPushButton::clicked, this, &MainWindow::onClearButtonClicked);
        } else if (button->text() == "=") {
            QObject::connect(button, &QPushButton::clicked, this, &MainWindow::onEqualButtonClicked);
        } else {
            QObject::connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
        }
    }
}

void MainWindow::onButtonClicked() {
    QPushButton *button = qobject_cast<QPushButton *>(sender());
    if (button) {
        QString buttonText = button->text();
        QString currentDisplayText = m_display->text();

        if (currentDisplayText == m_calculator.getResult() && !m_calculator.getResult().isEmpty()) {
            // 如果当前显示结果,则清除以开始新计算
            currentDisplayText.clear();
        }

        if (buttonText == "+" || buttonText == "-" || buttonText == "*" || buttonText == "/") {
            m_display->setText(currentDisplayText + " " + buttonText + " ");
        } else {
            m_display->setText(currentDisplayText + buttonText);
        }
    }
}

void MainWindow::onClearButtonClicked() {
    m_calculator.clear();
    m_display->clear();
}

void MainWindow::onEqualButtonClicked() {
    QString currentDisplayText = m_display->text();
    QStringList tokens = currentDisplayText.split(' ');

    if (tokens.size() >= 3) {
        m_calculator.inputNumber(tokens[0]);
        m_calculator.inputOperator(tokens[1]);
        m_calculator.inputNumber(tokens[2]);
        m_calculator.calculate();
        m_display->setText(currentDisplayText + " = " + m_calculator.getResult());
    }
}

main.cpp

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

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

    MainWindow mainWindow;
    mainWindow.show();

    return app.exec();
}

总结

在本篇博文中,我们使用ChatGPT和Qt从零开始构建了一个计算器应用。通过需求分析、软件设计、代码编写和测试优化等阶段的逐步指导,我们成功实现了一个具备基本功能的计算器应用。希望这个项目能够帮助您更好地理解和应用ChatGPT和Qt技术,并激发您在GUI开发领域的创造力。如果您对本项目有任何疑问或建议,请随时提出,谢谢!

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

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

相关文章

数据库监控与调优【八】—— 索引类型

索引类型 MySQL有多种索引类型&#xff0c;使用不同的角度&#xff0c;分类也有所不同。 程序猿之间沟通时&#xff0c;经常会聊到各种索引类型&#xff0c;比如你说&#xff1a;“这是一个组合索引”&#xff0c;他说“这是一个聚簇索引”&#xff0c;如果不了解这些术语&am…

【计算机网络】UDP和TCP的对比

1.协议栈 2.面向连接&#xff1f; 3.支持单薄、多播、广播&#xff1f; 4.面向应用报文还是字节流&#xff1f; 5.应用场景 6.首部长度 7.小结

python 实现批量图片不拉伸尺寸归一化

在进行机器学习或深度学习之前&#xff0c;都要对样本图片进行预处理&#xff0c;其中需要将图片的尺寸统一调整。很多时候&#xff0c;样本的来源很多&#xff0c;尺寸和比例也不统一&#xff0c;可能来自于互联网爬虫&#xff0c;可能来自于不同的手机拍摄。如果将不同尺寸与…

CentOS Linux 8使用阿里源(安装jdk11、git测试)

一、备份 cd /etc/yum.repos.d/ mkdir bak mv CentOS-Linux-* bak二、下载新源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo三、安装软件测试 sudo yum -y install java-11-openjdk-devel java -versionsudo yu…

瑞亚太空活动公司RSA与英国国防与安全加速器达成量子项目合作

​ &#xff08;图片来源&#xff1a;网络&#xff09; 瑞亚太空活动公司&#xff08;RSA&#xff09;与英国国防与安全加速器&#xff08;DASA&#xff09;签署了合作协议&#xff0c;主要开发名为“无限交换”的可操纵量子真空的技术项目。这是RSA在英国签订的第一份合同&…

B端产品之数据分析能力

目录 学习目标&#xff1a;数据分析的思维框架以及工作需要的知识结构&#xff0c;数据分析结果外化-撰写数据分析报告 分析流程分析要点分析报告 数据分析流程 明确主题&#xff0c;尽量细化提出假设验证并修正假设&#xff1a;分析过程中对各个关联维度进行数据可视化观察…

怎么用迅捷PDF转换器在线提取PDF文件中的图片

大家在学习或者是办公中经常使用到PDF文件&#xff0c;我们在做一份工作文件的时候&#xff0c;需要一些资料来补充内容&#xff0c;这些资料是以PDF文件格式呈现&#xff0c;在使用PDF文件时&#xff0c;文件中有的图片做到很精细&#xff0c;想要单独提取保存下来备用。那么&…

【解决】IntelliJ IDEA无法识别package.json里面定义的脚本问题(npm: No scripts found)

错误提示&#xff1a;npm: No scripts found 在File-Settings-Editor-File Types&#xff0c;右边找到JSON&#xff0c;在File name patterns中添加了*.json,然后就识别了

全局安装vue脚手架,VSCode没有权限

一、全局安装vue脚手架 winR&#xff0c;输入cmd&#xff0c;打开命令行窗口&#xff0c;输入 npm install -g vue/cli &#xff0c;回车 npm install -g vue/cli 二、查看是否安装成功&#xff0c;出现版本信息&#xff0c;就表示安装成功 vue --version 三、打开VSCode&…

基于matlab偏振建模和分析(附源码)

一、前言 这个例子介绍了极化的基本概念。它展示了如何使用相控阵系统工具箱分析极化场并对极化天线和目标之间的信号传输进行建模。 二、电磁场的极化 天线产生的电磁场与远场中的传播方向正交。场可以指向此平面中的任何方向&#xff0c;因此可以分解为两个正交分量。从理论上…

EC\AC\BC\pair-wise组合覆盖测试技术

基本概念介绍 场景说明 某个美颜相机的系统测试&#xff1a; 被测对象1-【系统】取值有3种可能&#xff1a;windows\IOS\Linux 被测对象2-【摄像头】取值有4种可能&#xff1a;徕卡\索尼\三星\舜宇 被测对象3-【环境】取值有2种可能&#xff1a;白天\黑夜 问题&#xff1a;如何…

使用matlab求解常微分方程(组)问题

前言 介绍了常微分方程组的基本形式&#xff0c;并且介绍了matlab的数值和解析解法&#xff0c;以及给出了相应的案例。 前言1. 常微分方程组介绍1.1 一阶常微分方程组1.2 高阶常微分方程组1.2.1 形式1&#xff1a;单个高阶微分方程1.2.2 形式2&#xff1a;多个高阶微分方程组 …

XILINX 7系列FPGA普通IO与差分IO

&#x1f3e1;《Xilinx FPGA开发宝典》 目录 1&#xff0c;概述2&#xff0c;IO说明3&#xff0c;总结 1&#xff0c;概述 本文介绍XILINX 7系列FPGA普通IO和差分IO的识别方法与注意事项。 2&#xff0c;IO说明 7系列FPGA的绝大多数IO均支持差分&#xff0c;但是有些IO是不支持…

C语言:求Sn=a+aa+aaa+aaaa+aaaaa+……的前n项之和

题目&#xff1a; 求Snaaaaaaaaaaaaaaa……的前n项之和&#xff0c;其中a是一个数字&#xff0c; 例如&#xff1a;222222222222222…… 思路&#xff1a; 总体思路&#xff1a; &#xff08;一&#xff09;. 生成变量&#xff1a; int a 0; -- 题目中的a int n 0; -- a 的前…

个人git笔记,持续学习并补充填写

git --version //查看git版本信息 sudo yum remove git -y //卸载gitsudo yum install git -y//安装git 该文章仅仅是为了方便个人日常观看&#xff0c;有些地方没有做详细介绍 git init 创建本地仓库&#xff08;最好先创建一个目录&#xff0c;在该目录下输入指令创建git仓…

DETR系列:RT-DETR 论文解析

论文&#xff1a;《DETRs Beat YOLOs on Real-time Object Detection》 2023.4 DETRs Beat YOLOs on Real-time Object Detection&#xff1a;https://arxiv.org/pdf/2304.08069.pdf 源码地址&#xff1a;https://github.com/PaddlePaddle/PaddleDetection/tree/develop/conf…

MybatisPlus 用法

MybatisPlus 用法--wrapper的用法 MybatisPlus 原理常见wrapper的用法eq等值查询 与 ne不等值查询gt 大于 与 ge 大于等于、lt小于与le小于等于between 在某个区间内 与 notBetween不在某个区间内in在范围内的值 与 notIn不在范围内的值inSql、notInSql(几乎用不到)orderBy、o…

Android——基本控件(下)(十五)

1. 对话框&#xff1a;Dialog 1.1 知识点 &#xff08;1&#xff09;掌握对话框的主要作用&#xff1b; &#xff08;2&#xff09;可以使用AlertDialog和AlertDialog.Builder进行对话框的建立&#xff1b; &#xff08;3&#xff09;可以通过LayoutInflater进行定制对话框…

前端JavaScript入门-day02

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一.运算符 1.1 赋值运算符 1.2 一元运算符 自增运算符的用法&#xff1a; 1.3 比较运算符 比较运算符…

超越竞争,使用Framework技术赢得市场份额

Framework为什么这么重要&#xff1f; 在Android开发中&#xff0c;Framework&#xff08;框架&#xff09;是非常重要的&#xff0c;因为它提供了一套已经实现的软件组件和工具&#xff0c;以支持开发者构建应用程序。以下是Framework在Android开发中的重要性&#xff1a; 提…