QT——简易计算器(从0开始)

news2024/11/20 20:30:09

目录

一、题目描述:

二、创建工程:

1. ​编辑

2. 

3. 

4. 默认

5. 

6. 

7.

8. 默认

9. 创建完成

三、UI界面设计:

1. 添加按钮

1. 

2. 按钮界面

3. 按钮绑定快捷键

2. 文本框添加

1. 文本框字体

2. 默认文本

3. 文本对齐方式

3. 添加图片

1. 找到图片并添加到工程目录下

2.  

3. 

4. 图片名称

5. 

6.添加-->添加前缀

7. 再次添加 -- > 添加文件,此次有 添加文件 了

8.选择图片文件

9. 成功添加文件 -->>> 运行一下

10. 成功

4. 按钮添加图片

 1. -->> 选择资源

2. 选择对应的图片资源

3. 添加成功

5. UI界面大致样式

四、程序编写:

1. 思路:

2. 创建类:

1.

2. 

3.

4.

5. 创建成功

6. 同上方式载创建一个 Calculate 类

3. data类:

(1)data.h

(2)data.cpp

          1. 初始化数据

        2. 数据更新

        3. 显示计算数据

        4. 更新状态

        5. 删除键处理

        6. data.cpp总代码

4. Calculate类:

(1)calculate.h

(2)calculate.cpp 

5. Dialog (联系/对象/触发信号)

(1)dialog .h 

        1. 创建对象

        2. 计算函数触发信号

        3. 文本框显示处理函数

(2)dialog .cpp(联系及初始化)

        1. 联系及其初始化

        2. 显示计算数据(注意头文件)

6.  Dialog(按键处理)

1. 按键转为槽方法

        1. 

        2. 

        3. 

2. 0~9数字按键处理

3. 运算符处理

4. 计算结果

5. 删除键

6. 清零键

7. 图像小按键

7.  Dialog(总程序)

(1)dialog .h 

(2)dialog .cpp

8. 主函数

五、总程序:

1. headers

        1. Calculate.h

        2. Data.h

        3. Dialog.h

2. Soures

  1. Calculate.cpp

        2. Data.cpp

        3. Dialog.cpp

        4. main.cpp

六、windows可执行文件

1. 生成exe文件

2. exe文件存放

3. 找到

4. 此处需要准确(二 、7)

5. 执行 windeployqt  exe文件目录

​编辑

七、实现效果


一、题目描述:

        创建一个简单的图形用户界面(GUI),包括一个文本框用于显示计算结果,以及数字键盘和运算符按钮。用户可以通过点击这些按钮输入数字和运算符,并查看计算结果。

        实现计算功能,编写相应的代码逻辑。当用户输入两个数字和一个运算符时,程序会根据运算符执行相应的加、减、乘、除运算,并将结果显示在文本框中。简化:要求不包含小数,使用整数运算。

        以简洁明了的方式呈现给用户,使用户可以轻松地进行基本的算术计算。尽量确保界面设计简单大方,操作直观,为用户提供良好的使用体验。

二、创建工程:

1. 
 
2. 

3. 

4. 默认

5. 

6. 

7.

8. 默认

9. 创建完成

三、UI界面设计:

1. 添加按钮

1. 

2. 按钮界面

3. 按钮绑定快捷键

2. 文本框添加

1. 文本框字体

2. 默认文本

3. 文本对齐方式

3. 添加图片

1. 找到图片并添加到工程目录下

        

2.  

3. 

4. 图片名称

5. 

6.添加-->添加前缀

7. 改成一个下划线

7. 再次添加 -- > 添加文件,此次有 添加文件 了

8.选择图片文件

9. 成功添加文件 -->>> 运行一下

10. 成功

4. 按钮添加图片

 1. -->> 选择资源

2. 选择对应的图片资源

3. 添加成功

5. UI界面大致样式

四、程序编写:

1. 思路:

        用两个类来处理,一个data保存运算符,数字等。一个用于保存算式计算函数。

        data类,中初始化数据,2为数据,一个运算符,一个状态数。

        Calculate类:主一个运算函数,多个触发信号

2. 创建类:

1.

2. 

3.

4.

5. 创建成功

6. 同上方式载创建一个 Calculate 类

3. data类:

(1)data.h

#ifndef DATA_H
#define DATA_H

#include <QObject>

//#include <dialog.h>

class Data : public QObject
{
    Q_OBJECT
public:
    explicit Data(QObject *parent = nullptr);
    int num1;
    int num2;
    int state; //保存当前数据状态
    char operator_c;    //运算符


signals:

public slots:

    void  init_data();//初始化数据
    //int update_satate(int a,int b, int i);         //根据状态改变数
    void  update(int a);                            //将数据更新 比如原本是 1 按下 5 后通过此函数  变成 51;
    void  upstate(int i);                           //更新状态  0更改num1 // 1更改char // 2 更改 num2
    void  backspace();                              //删除键
    void  display_data(int i);                      //显示计算数据



};


#endif // DATA_H

(2)data.cpp

          1. 初始化数据
void Data::init_data(){
    num1 = 0;
    num2 = 0;
    state = 0;
    operator_c = ' ';
}
        2. 数据更新

        根据不同状态,看保存到第一位数据还是第二位数据

void Data::update(int a){   //将数据更新 //比如原本是 1 按下 5 后通过此函数  变成 51;
    //状态更新处理
    if(state == 1){
        upstate(2);
    }

    if(state == 0) num1 = num1*10+a;
    else if(state == 2) num2 = num2*10+a;


}
        3. 显示计算数据
void Data::display_data(int i){    //显示计算数据
    if(i == 0){
        qDebug()<<num1<<" ";//<<operator_c<<" "<<num2;

     }
    else if( i == 1)
        qDebug()<<num1<<" "<<operator_c;//<<" "<<num2;
    else if( i == 2)
        qDebug()<<num1<<" "<<operator_c<<" "<<num2;
    else
        qDebug()<<num1<<" ";//<<operator_c<<" "<<num2;

    qDebug()<<"     ";


}
        4. 更新状态
void Data::upstate(int i){             //更新状态  0更改num1 // 1更改char // 2 更改 num2
    state = i;
}
        5. 删除键处理

        根据状态从最后一会数据开始删除。

        6. data.cpp总代码
#include "data.h"

#include "QDebug"
#pragma execution_character_set("utf-8")

#include <QLineEdit>



Data::Data(QObject *parent) : QObject(parent)
{

}


void Data::init_data(){
    num1 = 0;
    num2 = 0;
    state = 0;
    operator_c = ' ';
}


void Data::update(int a){   //将数据更新 //比如原本是 1 按下 5 后通过此函数  变成 51;
    //状态更新处理
    if(state == 1){
        upstate(2);
    }

    if(state == 0) num1 = num1*10+a;
    else if(state == 2) num2 = num2*10+a;
}



void Data::display_data(int i){    //显示计算数据
    if(i == 0){
        qDebug()<<num1<<" ";//<<operator_c<<" "<<num2;

     }
    else if( i == 1)
        qDebug()<<num1<<" "<<operator_c;//<<" "<<num2;
    else if( i == 2)
        qDebug()<<num1<<" "<<operator_c<<" "<<num2;
    else
        qDebug()<<num1<<" ";//<<operator_c<<" "<<num2;

    qDebug()<<"     ";


}

void Data::upstate(int i){             //更新状态  0更改num1 // 1更改char // 2 更改 num2
    state = i;
}



void  Data::backspace(){                              //删除键
    if(state == 0){
        num1 = num1/10;
    }
    else if(state == 1){
        state = 0;
    }
    else if(state == 2){
        num2 = num2/10;
        if(num2 == 0) state = 1;
    }
}


4. Calculate类:

(1)calculate.h

#ifndef CALCULATE_H
#define CALCULATE_H

#include <QObject>

class Calculate : public QObject
{
    Q_OBJECT
public:
    explicit Calculate(QObject *parent = nullptr);

signals:
    void signal_num(int a); //num 触发信号
    void display(int i);    //计算机显示界面
    void backspace();       //删除键触发信号

public slots:
        float operation(int num1, char c, int num2);    //运算函数
        //float operation(float num1, char c, float num2);    //运算函数
};

#endif // CALCULATE_H

(2)calculate.cpp 

#include "calculate.h"
#include <iostream>
#include "QDebug"
#pragma execution_character_set("utf-8")

Calculate::Calculate(QObject *parent) : QObject(parent)
{

}


//float Calculate::operation(float num1, char c, float num2){    //运算函数
float Calculate::operation(int num1, char c, int num2){    //运算函数
    float num = 0;

    if(c == '+'){
            num = num1 + num2;
    }
    else if(c == '-'){
                num = num1 - num2;
     }
    else if(c == '*'){
                num = num1 * num2;
     }
    else if(c == '/'){
                num = static_cast<float>(num1) / num2;  //static_cast<float>强制转换
     }
    else{
               qDebug()<<"运算符不在以知范围内";
    }

    return num;
}

5. Dialog (联系/对象/触发信号)

(1)dialog .h 

        1. 创建对象
    Data *data = new Data;  //创建数字
    Calculate *calculate = new Calculate;   //创建运算函数
        2. 计算函数触发信号

signals:
    void display_data_signals(int num1, char c, int num2, int state);//显示计算数据
        3. 文本框显示处理函数

private slots:

    void  display_data(int num1, char c, int num2, int state);//显示计算数据

(2)dialog .cpp(联系及初始化)

        1. 联系及其初始化
    data -> init_data();    //初始化数据
    connect(calculate, SIGNAL(signal_num(int)), data, SLOT(update(int)));           //数据联系
    connect(calculate, SIGNAL(display(int)), data, SLOT(display_data(int)));        //显示联系 终点显示
    connect(calculate, SIGNAL(backspace()), data, SLOT(backspace()));               //删除键 -联系

    
    connect(this, SIGNAL(display_data_signals(int,char,int,int)), this, SLOT(display_data(int,char,int,int)));               //文本框显示
        2. 显示计算数据(注意头文件)

#include <cstdio>
#include <string>
#include <QLineEdit>



void  Dialog::display_data(int num1, char c, int num2, int state){//显示计算数据

    char num1_c[20];
    sprintf(num1_c, "%d", num1);

    char num2_c[20];
    sprintf(num2_c, "%d", num2);

    std::string result;//拼接字符串

    if(state == 0)
        result = std::to_string(num1);
    else if( state == 1)
        result = std::to_string(num1) + c;
    else if( state == 2)
        result = std::to_string(num1) + c + std::to_string(num2);
    else
        result = std::to_string(num1);

    ui->lineEdit->setText(result.c_str());
}

6.  Dialog(按键处理)

1. 按键转为槽方法

        1. 

        2. 

        3. 

2. 0~9数字按键处理

        此处调用 signal_num(i)  i 为每次输入的数字,剩下两行显示在终端和文本框;


//按钮 0
void Dialog::on_pushButton_10_clicked()
{
    emit this -> calculate -> signal_num(0);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

        其余0~9的按键通用,只是传入数字不一样

3. 运算符处理

        其余减乘除同理 除非符合位不一样


//按钮 +
void Dialog::on_pushButton_13_clicked()
{
    if(data -> state == 2){ //如果前面已经满足等式要求
        this -> on_pushButton_12_clicked();//计算出结果  并将结果保存到num1
    }

        data -> operator_c = '+';
        data -> state = 1;  //更新显示状态
        emit this -> calculate -> display(data -> state);   //显示state下的
        emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框

}

4. 计算结果


//计算结果
void Dialog::on_pushButton_12_clicked()
{
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框

    //计算结果
    float num = calculate -> operation(data -> num1, data->operator_c, data -> num2);

    qDebug()<<"    = "<<num;

    int num_n = num;//获取其整数值

    char num_c[20];
    if(data -> operator_c == '/')
        sprintf(num_c, "= %f", num);
    else
        sprintf(num_c, "= %d", num_n);

    ui->lineEdit->setText(num_c);

    //将计算结果给num1;
    //data -> num1 = static_cast<int>(num); //static_cast<float>强制转换
    //data -> upstate(0);
    data -> init_data(); //从0开始 //清零
    data -> num1 = num_n;

    qDebug()<<"  ";
}

5. 删除键


//删除键
void Dialog::on_pushButton_18_clicked()
{
    emit this -> calculate -> backspace();              //触发删除键
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

6. 清零键

//清零
void Dialog::on_pushButton_17_clicked()
{
    data -> init_data(); //从0开始 //清零
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

7. 图像小按键

void Dialog::on_pushButton_11_clicked()
{
    static  int i = -1;
    i++;
    switch(i){
    case 0:{
        ui->lineEdit->setText("(๑°⌓°๑)       ");
        qDebug()<<"被发现了!!!";
        break;
    }
    case 1:{
        ui->lineEdit->setText("˳⚆ɞ⚆˳       ");
        qDebug()<<"又发现了一个!!!";
        break;
    }
    case 2:{
        ui->lineEdit->setText("દ ᵕ̈ ૩        ");
        qDebug()<<"别找了别找了 !!!";
        break;
    }
    case 3:{
        ui->lineEdit->setText("(•̥́_•ૅू˳)       ");
        qDebug()<<"投降投降-->> !!!";
        break;
    }
    case 4:{
        ui->lineEdit->setText("♪(゚▽^*)ノ⌒☆ ");
        qDebug()<<"啦~啦~啦 听歌吗 !!!";
        break;
    }
    case 5:{
        ui->lineEdit->setText("~⃝ ˶ʜᴀᴘᴘʏ ᴅᴀʏs");
        qDebug()<<" !!!";
        break;
    }
    default :{
        ui->lineEdit->setText("没图了,下班");
        i = -1;
    }

    }

}

7.  Dialog(总程序)

(1)dialog .h 

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <data.h>
#include <calculate.h>
QT_BEGIN_NAMESPACE

namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

    Data *data = new Data;  //创建数字
    Calculate *calculate = new Calculate;   //创建运算函数

signals:
    void display_data_signals(int num1, char c, int num2, int state);//显示计算数据


private slots:

    void  display_data(int num1, char c, int num2, int state);//显示计算数据

    void on_pushButton_10_clicked();

    void on_pushButton_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_13_clicked();

    void on_pushButton_14_clicked();

    void on_pushButton_15_clicked();

    void on_pushButton_16_clicked();

    void on_pushButton_18_clicked();

    void on_pushButton_12_clicked();

    void on_pushButton_17_clicked();







    void on_pushButton_11_clicked();

private:
    Ui::Dialog *ui;
};


#endif // DIALOG_H

(2)dialog .cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <iostream>
#include <QMessageBox> // 包含QMessageBox头文件
#include "QDebug"
#pragma execution_character_set("utf-8")

#include <cstdio>
#include <string>
#include <QLineEdit>


Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    data -> init_data();    //初始化数据
    connect(calculate, SIGNAL(signal_num(int)), data, SLOT(update(int)));           //数据联系
    connect(calculate, SIGNAL(display(int)), data, SLOT(display_data(int)));        //显示联系 终点显示
    connect(calculate, SIGNAL(backspace()), data, SLOT(backspace()));               //删除键 -联系

    
    connect(this, SIGNAL(display_data_signals(int,char,int,int)), this, SLOT(display_data(int,char,int,int)));               //文本框显示

    //按键已与键盘正常绑定 可直接键盘输入 空格清零
    //小数点有彩蛋


}

Dialog::~Dialog()
{
    delete ui;
}

void  Dialog::display_data(int num1, char c, int num2, int state){//显示计算数据

    char num1_c[20];
    sprintf(num1_c, "%d", num1);

    char num2_c[20];
    sprintf(num2_c, "%d", num2);

    std::string result;//拼接字符串

    if(state == 0)
        result = std::to_string(num1);
    else if( state == 1)
        result = std::to_string(num1) + c;
    else if( state == 2)
        result = std::to_string(num1) + c + std::to_string(num2);
    else
        result = std::to_string(num1);

    ui->lineEdit->setText(result.c_str());
}


//按钮 0
void Dialog::on_pushButton_10_clicked()
{
    emit this -> calculate -> signal_num(0);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 1
void Dialog::on_pushButton_clicked()
{
    emit this -> calculate -> signal_num(1);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 2
void Dialog::on_pushButton_2_clicked()
{
    emit this -> calculate -> signal_num(2);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 3
void Dialog::on_pushButton_3_clicked()
{
    emit this -> calculate -> signal_num(3);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 4
void Dialog::on_pushButton_4_clicked()
{
    emit this -> calculate -> signal_num(4);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 5
void Dialog::on_pushButton_5_clicked()
{
    emit this -> calculate -> signal_num(5);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 6
void Dialog::on_pushButton_6_clicked()
{
    emit this -> calculate -> signal_num(6);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 7
void Dialog::on_pushButton_7_clicked()
{
    emit this -> calculate -> signal_num(7);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 8
void Dialog::on_pushButton_8_clicked()
{
    emit this -> calculate -> signal_num(8);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 9
void Dialog::on_pushButton_9_clicked()
{
    emit this -> calculate -> signal_num(9);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 +
void Dialog::on_pushButton_13_clicked()
{
    if(data -> state == 2){ //如果前面已经满足等式要求
        this -> on_pushButton_12_clicked();//计算出结果  并将结果保存到num1
    }

        data -> operator_c = '+';
        data -> state = 1;  //更新显示状态
        emit this -> calculate -> display(data -> state);   //显示state下的
        emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框

}

//按钮 -
void Dialog::on_pushButton_14_clicked()
{
    if(data -> state == 2){ //如果前面已经满足等式要求
        this -> on_pushButton_12_clicked();//计算出结果  并将结果保存到num1
    }
    data -> operator_c = '-';
    data -> state = 1;  //更新显示状态
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 *
void Dialog::on_pushButton_15_clicked()
{
    if(data -> state == 2){ //如果前面已经满足等式要求
        this -> on_pushButton_12_clicked();//计算出结果  并将结果保存到num1
    }
    data -> operator_c = '*';
    data -> state = 1;  //更新显示状态
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 /
void Dialog::on_pushButton_16_clicked()
{
    if(data -> state == 2){ //如果前面已经满足等式要求  直接计算
        this -> on_pushButton_12_clicked();//计算出结果  并将结果保存到num1
    }
    data -> operator_c = '/';
    data -> state = 1;  //更新显示状态
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//删除键
void Dialog::on_pushButton_18_clicked()
{
    emit this -> calculate -> backspace();              //触发删除键
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//计算结果
void Dialog::on_pushButton_12_clicked()
{
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框

    //计算结果
    float num = calculate -> operation(data -> num1, data->operator_c, data -> num2);

    qDebug()<<"    = "<<num;

    int num_n = num;//获取其整数值

    char num_c[20];
    if(data -> operator_c == '/')
        sprintf(num_c, "= %f", num);
    else
        sprintf(num_c, "= %d", num_n);

    ui->lineEdit->setText(num_c);

    //将计算结果给num1;
    //data -> num1 = static_cast<int>(num); //static_cast<float>强制转换
    //data -> upstate(0);
    data -> init_data(); //从0开始 //清零
    data -> num1 = num_n;

    qDebug()<<"  ";
}

//清零
void Dialog::on_pushButton_17_clicked()
{
    data -> init_data(); //从0开始 //清零
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}


void Dialog::on_pushButton_11_clicked()
{
    static  int i = -1;
    i++;
    switch(i){
    case 0:{
        ui->lineEdit->setText("(๑°⌓°๑)       ");
        qDebug()<<"被发现了!!!";
        break;
    }
    case 1:{
        ui->lineEdit->setText("˳⚆ɞ⚆˳       ");
        qDebug()<<"又发现了一个!!!";
        break;
    }
    case 2:{
        ui->lineEdit->setText("દ ᵕ̈ ૩        ");
        qDebug()<<"别找了别找了 !!!";
        break;
    }
    case 3:{
        ui->lineEdit->setText("(•̥́_•ૅू˳)       ");
        qDebug()<<"投降投降-->> !!!";
        break;
    }
    case 4:{
        ui->lineEdit->setText("♪(゚▽^*)ノ⌒☆ ");
        qDebug()<<"啦~啦~啦 听歌吗 !!!";
        break;
    }
    case 5:{
        ui->lineEdit->setText("~⃝ ˶ʜᴀᴘᴘʏ ᴅᴀʏs");
        qDebug()<<" !!!";
        break;
    }
    default :{
        ui->lineEdit->setText("没图了,下班");
        i = -1;
    }

    }

}

8. 主函数

#include "dialog.h"

#include <QApplication>
#include <QIcon>

#include "QDebug"
#pragma execution_character_set("utf-8")


#include <QApplication>
#include <QLabel>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    w.setWindowTitle("0X78的计算机");
    w.setWindowIcon(QIcon(":/img/JSJ.jpg"));


    return a.exec();
}

五、总程序:

1. headers

        1. Calculate.h

#ifndef CALCULATE_H
#define CALCULATE_H

#include <QObject>

class Calculate : public QObject
{
    Q_OBJECT
public:
    explicit Calculate(QObject *parent = nullptr);

signals:
    void signal_num(int a); //num 触发信号
    void display(int i);    //计算机显示界面
    void backspace();       //删除键触发信号

public slots:
        float operation(int num1, char c, int num2);    //运算函数
        //float operation(float num1, char c, float num2);    //运算函数
};

#endif // CALCULATE_H

        2. Data.h

#ifndef DATA_H
#define DATA_H

#include <QObject>

//#include <dialog.h>

class Data : public QObject
{
    Q_OBJECT
public:
    explicit Data(QObject *parent = nullptr);
    int num1;
    int num2;
    int state; //保存当前数据状态
    char operator_c;    //运算符


signals:

public slots:

    void  init_data();//初始化数据
    //int update_satate(int a,int b, int i);         //根据状态改变数
    void  update(int a);                            //将数据更新 比如原本是 1 按下 5 后通过此函数  变成 51;
    void  upstate(int i);                           //更新状态  0更改num1 // 1更改char // 2 更改 num2
    void  backspace();                              //删除键
    void  display_data(int i);                      //显示计算数据



};


#endif // DATA_H

        3. Dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <data.h>
#include <calculate.h>
QT_BEGIN_NAMESPACE

namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

    Data *data = new Data;  //创建数字
    Calculate *calculate = new Calculate;   //创建运算函数

signals:
    void display_data_signals(int num1, char c, int num2, int state);//显示计算数据


private slots:

    void  display_data(int num1, char c, int num2, int state);//显示计算数据

    void on_pushButton_10_clicked();

    void on_pushButton_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_13_clicked();

    void on_pushButton_14_clicked();

    void on_pushButton_15_clicked();

    void on_pushButton_16_clicked();

    void on_pushButton_18_clicked();

    void on_pushButton_12_clicked();

    void on_pushButton_17_clicked();







    void on_pushButton_11_clicked();

private:
    Ui::Dialog *ui;
};


#endif // DIALOG_H

2. Soures

  1. Calculate.cpp

#include "calculate.h"
#include <iostream>
#include "QDebug"
#pragma execution_character_set("utf-8")

Calculate::Calculate(QObject *parent) : QObject(parent)
{

}


//float Calculate::operation(float num1, char c, float num2){    //运算函数
float Calculate::operation(int num1, char c, int num2){    //运算函数
    float num = 0;

    if(c == '+'){
            num = num1 + num2;
    }
    else if(c == '-'){
                num = num1 - num2;
     }
    else if(c == '*'){
                num = num1 * num2;
     }
    else if(c == '/'){
                num = static_cast<float>(num1) / num2;  //static_cast<float>强制转换
     }
    else{
               qDebug()<<"运算符不在以知范围内";
    }

    return num;
}

        2. Data.cpp

#include "data.h"

#include "QDebug"
#pragma execution_character_set("utf-8")

#include <QLineEdit>



Data::Data(QObject *parent) : QObject(parent)
{

}


void Data::init_data(){
    num1 = 0;
    num2 = 0;
    state = 0;
    operator_c = ' ';
}


void Data::update(int a){   //将数据更新 //比如原本是 1 按下 5 后通过此函数  变成 51;
    //状态更新处理
    if(state == 1){
        upstate(2);
    }

    if(state == 0) num1 = num1*10+a;
    else if(state == 2) num2 = num2*10+a;
}



void Data::display_data(int i){    //显示计算数据
    if(i == 0){
        qDebug()<<num1<<" ";//<<operator_c<<" "<<num2;

     }
    else if( i == 1)
        qDebug()<<num1<<" "<<operator_c;//<<" "<<num2;
    else if( i == 2)
        qDebug()<<num1<<" "<<operator_c<<" "<<num2;
    else
        qDebug()<<num1<<" ";//<<operator_c<<" "<<num2;

    qDebug()<<"     ";


}

void Data::upstate(int i){             //更新状态  0更改num1 // 1更改char // 2 更改 num2
    state = i;
}



void  Data::backspace(){                              //删除键
    if(state == 0){
        num1 = num1/10;
    }
    else if(state == 1){
        state = 0;
    }
    else if(state == 2){
        num2 = num2/10;
        if(num2 == 0) state = 1;
    }
}


        3. Dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <iostream>
#include <QMessageBox> // 包含QMessageBox头文件
#include "QDebug"
#pragma execution_character_set("utf-8")

#include <cstdio>
#include <string>
#include <QLineEdit>


Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    data -> init_data();    //初始化数据
    connect(calculate, SIGNAL(signal_num(int)), data, SLOT(update(int)));           //数据联系
    connect(calculate, SIGNAL(display(int)), data, SLOT(display_data(int)));        //显示联系 终点显示
    connect(calculate, SIGNAL(backspace()), data, SLOT(backspace()));               //删除键 -联系

    
    connect(this, SIGNAL(display_data_signals(int,char,int,int)), this, SLOT(display_data(int,char,int,int)));               //文本框显示

    //按键已与键盘正常绑定 可直接键盘输入 空格清零
    //小数点有彩蛋


}

Dialog::~Dialog()
{
    delete ui;
}

void  Dialog::display_data(int num1, char c, int num2, int state){//显示计算数据

    char num1_c[20];
    sprintf(num1_c, "%d", num1);

    char num2_c[20];
    sprintf(num2_c, "%d", num2);

    std::string result;//拼接字符串

    if(state == 0)
        result = std::to_string(num1);
    else if( state == 1)
        result = std::to_string(num1) + c;
    else if( state == 2)
        result = std::to_string(num1) + c + std::to_string(num2);
    else
        result = std::to_string(num1);

    ui->lineEdit->setText(result.c_str());
}


//按钮 0
void Dialog::on_pushButton_10_clicked()
{
    emit this -> calculate -> signal_num(0);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 1
void Dialog::on_pushButton_clicked()
{
    emit this -> calculate -> signal_num(1);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 2
void Dialog::on_pushButton_2_clicked()
{
    emit this -> calculate -> signal_num(2);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 3
void Dialog::on_pushButton_3_clicked()
{
    emit this -> calculate -> signal_num(3);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 4
void Dialog::on_pushButton_4_clicked()
{
    emit this -> calculate -> signal_num(4);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 5
void Dialog::on_pushButton_5_clicked()
{
    emit this -> calculate -> signal_num(5);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 6
void Dialog::on_pushButton_6_clicked()
{
    emit this -> calculate -> signal_num(6);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 7
void Dialog::on_pushButton_7_clicked()
{
    emit this -> calculate -> signal_num(7);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 8
void Dialog::on_pushButton_8_clicked()
{
    emit this -> calculate -> signal_num(8);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 9
void Dialog::on_pushButton_9_clicked()
{
    emit this -> calculate -> signal_num(9);
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 +
void Dialog::on_pushButton_13_clicked()
{
    if(data -> state == 2){ //如果前面已经满足等式要求
        this -> on_pushButton_12_clicked();//计算出结果  并将结果保存到num1
    }

        data -> operator_c = '+';
        data -> state = 1;  //更新显示状态
        emit this -> calculate -> display(data -> state);   //显示state下的
        emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框

}

//按钮 -
void Dialog::on_pushButton_14_clicked()
{
    if(data -> state == 2){ //如果前面已经满足等式要求
        this -> on_pushButton_12_clicked();//计算出结果  并将结果保存到num1
    }
    data -> operator_c = '-';
    data -> state = 1;  //更新显示状态
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 *
void Dialog::on_pushButton_15_clicked()
{
    if(data -> state == 2){ //如果前面已经满足等式要求
        this -> on_pushButton_12_clicked();//计算出结果  并将结果保存到num1
    }
    data -> operator_c = '*';
    data -> state = 1;  //更新显示状态
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//按钮 /
void Dialog::on_pushButton_16_clicked()
{
    if(data -> state == 2){ //如果前面已经满足等式要求  直接计算
        this -> on_pushButton_12_clicked();//计算出结果  并将结果保存到num1
    }
    data -> operator_c = '/';
    data -> state = 1;  //更新显示状态
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//删除键
void Dialog::on_pushButton_18_clicked()
{
    emit this -> calculate -> backspace();              //触发删除键
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}

//计算结果
void Dialog::on_pushButton_12_clicked()
{
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框

    //计算结果
    float num = calculate -> operation(data -> num1, data->operator_c, data -> num2);

    qDebug()<<"    = "<<num;

    int num_n = num;//获取其整数值

    char num_c[20];
    if(data -> operator_c == '/')
        sprintf(num_c, "= %f", num);
    else
        sprintf(num_c, "= %d", num_n);

    ui->lineEdit->setText(num_c);

    //将计算结果给num1;
    //data -> num1 = static_cast<int>(num); //static_cast<float>强制转换
    //data -> upstate(0);
    data -> init_data(); //从0开始 //清零
    data -> num1 = num_n;

    qDebug()<<"  ";
}

//清零
void Dialog::on_pushButton_17_clicked()
{
    data -> init_data(); //从0开始 //清零
    emit this -> calculate -> display(data -> state);   //显示state下的
    emit this -> display_data_signals(data -> num1, data -> operator_c, data -> num2, data -> state);   //将数据显示到文本框
}


void Dialog::on_pushButton_11_clicked()
{
    static  int i = -1;
    i++;
    switch(i){
    case 0:{
        ui->lineEdit->setText("(๑°⌓°๑)       ");
        qDebug()<<"被发现了!!!";
        break;
    }
    case 1:{
        ui->lineEdit->setText("˳⚆ɞ⚆˳       ");
        qDebug()<<"又发现了一个!!!";
        break;
    }
    case 2:{
        ui->lineEdit->setText("દ ᵕ̈ ૩        ");
        qDebug()<<"别找了别找了 !!!";
        break;
    }
    case 3:{
        ui->lineEdit->setText("(•̥́_•ૅू˳)       ");
        qDebug()<<"投降投降-->> !!!";
        break;
    }
    case 4:{
        ui->lineEdit->setText("♪(゚▽^*)ノ⌒☆ ");
        qDebug()<<"啦~啦~啦 听歌吗 !!!";
        break;
    }
    case 5:{
        ui->lineEdit->setText("~⃝ ˶ʜᴀᴘᴘʏ ᴅᴀʏs");
        qDebug()<<" !!!";
        break;
    }
    default :{
        ui->lineEdit->setText("没图了,下班");
        i = -1;
    }

    }

}

        4. main.cpp

#include "dialog.h"

#include <QApplication>
#include <QIcon>

#include "QDebug"
#pragma execution_character_set("utf-8")


#include <QApplication>
#include <QLabel>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    w.setWindowTitle("0X78的计算机");
    w.setWindowIcon(QIcon(":/img/JSJ.jpg"));


    return a.exec();
}

六、windows可执行文件

1. 生成exe文件

        1.

        2.再次运行就能生成exe

        3. exe文件位置

2. exe文件存放

        新建一个文件夹将exe文件放入,这个文件夹是保存exe所有文件的。

3. 找到

4. 此处需要准确(二 、7)

这里选择的为最初创建文件时,(二 、7)

5. 执行 windeployqt  exe文件目录

比如:

运行完毕

七、实现效果

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

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

相关文章

英智数字孪生机器人解决方案,赋能仓库物流模式全面升级

工业机械臂、仓储机器人、物流机器人等模式的机器人系统在现代产业中扮演着愈发重要的角色&#xff0c;他们的发展推动了自动化和智能化水平的提高&#xff0c;有助于为制造业、物流业、医疗保健业和服务业等行业创造新效率并提升人们的生活质量。 行业面临的挑战 机器人开发、…

为何要与云产商进行云端防护合作,上云企业如何保障云端安全

随着大数据、云计算等信息技术的迅猛发展&#xff0c;企业为了降低成本、提高效率&#xff0c;纷纷将业务迁移至云端。 随着大数据、云计算等信息技术的迅猛发展&#xff0c;企业为了降低成本、提高效率&#xff0c;纷纷将业务迁移至云端。这一全面的上云浪潮对传统的安全企业格…

YOLOv8+PyQt5野外火焰检测系统(可以从图像、视频和摄像头三种路径检测)

1.效果视频&#xff1a;https://www.bilibili.com/video/BV1Tm421s7te/?spm_id_from333.999.0.0 2.资源包含可视化的野外火焰检测系统&#xff0c;可用于火灾预警或火灾救援&#xff0c;该系统可自动检测和识别图片或视频当中出现的火焰&#xff0c;以及自动开启摄像头&#…

使用Windows GDI进行绘图

使用Windows GDI绘图&#xff0c;可以使用MFC&#xff0c;也可以直接使用Windows API绘图&#xff0c;两者其实都一样。MFC也是封装了Windows API。 下面以MFC为例&#xff0c;进行说明。因为MFC帮我们做好了一些底层&#xff0c;可以直接使用Windows GDI的函数。 在MFC中使用…

如此建立网络根文件系统 Mount NFS RootFS

安静NFS系统服务 sudo apt-get install nfs-kernel-server 创建目录 sudo mkdir /rootfsLee 将buildroot编译的根文件系统解压缩到 sudo tar xvf rootfs.tar -C /rootfsLee/ 添加文件NFS访问路径 sudo vi /etc/exports sudo /etc/exports文件&#xff0c;添加如下一行 …

SecureCRT中添加命令显示为空如何处理?(原因添加了空行)

相关背景信息 配置相关路径:~/Library/Application\ Support/VanDyke/SecureCRT/Config包括的配置信息 按钮、命令、全局配置、色彩、以及license都在$ ls ButtonBarV4.ini Commands Global.ini SSH2.ini Button…

STM32单片机通过ST-Link 烧录和调试

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. ST-LINK V2 2. 操作步骤 2.1 连接方式 2.2 驱动安装常规步骤 2.3 Keil中的设置 3. 调式仿真 4. 常见问题排查 1. ST-LINK V2 ST LINK v2下载器用于STM32单片机&#xff0c;可以下载程序、调试…

代码随想录第49天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之 LeetCode&#xff1a;121.买卖股票的最佳时机1_哔哩哔哩_bilibili 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一…

为什么常用氢化物

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff09;里的学员问&#xff1a;diffusion工序&#xff0c;所需要的气体种类有哪些&#xff1f; Diffusion是什么工序&#xff1f; "Diffusion"工序是通过热能将掺杂剂原子扩散到硅片中&#xff0c;以形…

AD高速板设计--RJ45(笔记)

瑞芯微VS全志科技&#xff08;处理器芯片王者&#xff09; - 知乎 (zhihu.com) RTL8211E应用&#xff08;二&#xff09;之信号输入、输出接口_rtl8211eg中文资料-CSDN博客 Raspberry Pi 硬件 - Raspberry Pi 文档 RJ45接口的PCB设计布局布线注意事项 - 知乎 (zhihu.com) 以…

CTF之eval

首先我们先了解一下eval&#xff08;&#xff09;函数 什么是eval()? eval() 函数把字符串按照 PHP 代码来计算。 该字符串必须是合法的 PHP 代码&#xff0c;且必须以分号结尾。 如果没有在代码字符串中调用 return 语句&#xff0c;则返回 NULL。如果代码中存在解析错误…

OpenCV直方图计算

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV实现直方图均衡 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::split 将图像划分…

Kubernetes中文件挂载的四种方式

一. Kubernetes入门 1.1 Kubernetes创建POD过程 1.2. Kubernetes基本操作 命令说明用法create创建kubectl create -f xx.yamledit编辑kubectl edit svc [POD的service名称]get获取kubectl get pod --namespaceXXXpatch更新kubectl patch -f xx.yamldelete删除kubectl delete …

[SWPUCTF-2022-新生赛]ez_sql

title:[SWPUCTF 2022 新生赛]ez_sql 审题 根据提示&#xff0c;POST传参 得到假的flag 判断类型 字符型注入 判断列数 发现空格和’or’被过滤 重新构造 nss-1/**/oorrder/**/by/**/4#发现为3个字段 采用联合注入union 爆库 发现union被过滤&#xff0c;双写union绕过 发…

sheng的学习笔记-AI-支持向量机(SVM)

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录 什么是向量机 SVM算法原理 SVM基本模型 SVM对偶问题 什么是对偶问题&#xff1a; 为什么使用对偶问题 拉格朗日定理 拉格朗日乘子法 对偶问题算法 非线性SVM算法原理 核函数 常用核函数 软间隔与正则化 软…

PMBOK® 第六版 项目是什么

目录 读后感—PMBOK第六版 目录 项目定义 定义&#xff1a;项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目的特征具备以下三点&#xff1a; 独特性&#xff1a;独一无二&#xff0c;无法简单重复过去的做法。 临时性&#xff1a;项目有明确的起点和终点&…

腾讯云邮件推送如何设置?群发邮件的技巧?

腾讯云邮件推送功能有哪些&#xff1f;怎么有效使用邮件推送&#xff1f; 腾讯云邮件推送以其稳定、高效的特点&#xff0c;受到了众多企业的青睐。那么&#xff0c;腾讯云邮件推送如何设置呢&#xff1f;又有哪些群发邮件的技巧呢&#xff1f;下面AokSend就来详细探讨一下。 …

AI预测体彩排列3第2套算法实战化测试第5弹2024年4月27日第5次测试

今天继续进行新算法的测试&#xff0c;今天是第5次测试。好了&#xff0c;废话不多说了&#xff0c;直接上图上结果。 2024年4月27日体彩排3预测结果 6码定位方案如下&#xff1a; 百位&#xff1a;6、2、1、7、8、9 十位&#xff1a;8、9、4、3、1、0 个位&#xff1a;3、7、8…

Python 数组控件的使用

当一个UI窗口界面内有多个相同类型的控件&#xff0c;且这多个控件的功能都类似时&#xff0c;使用数组控件是一个非常不错的选择&#xff0c;可以大大减少代码的编写 且 代码易读性强&#xff0c;可惜的是Python好象是没有数组控件这个东东。 我们来看看以下一个界面&#xff…

生成完美口型同步的 AI 代言人视频(及其实现原理详解)

目录 什么是Heygen? Heygen注册 Video Translation&#xff08;视频翻译 完美口型同步&#xff09; 实现原理详解 视频翻译部分 完美口型同步部分 什么是Heygen? Heygen是一款在线工具&#xff0c;可帮助您生成具有完美口型同步的 AI 代言人视频。 Heygen注册 https:…