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

目录

一、题目描述:

二、创建工程:

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文件目录

比如:

运行完毕

七、实现效果

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

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

相关文章

【介绍下IDM的实用功能】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

ptyhon画图显示中文

import matplotlib.pyplot as plt import matplotlib# 设置中文字体 matplotlib.rcParams[font.sans-serif] [SimHei] matplotlib.rcParams[font.family]sans-serifplt.plot([1, 2, 3, 4]) plt.xlabel(这是x轴) plt.ylabel(这是y轴) plt.title(这是标题) plt.show()用这个代码…

66、二分-搜索旋转排序数组

思路&#xff1a; 不断二分&#xff0c;首先判断左侧有序还是右侧有序&#xff0c;如果左侧有序那么就在左侧寻找&#xff0c;如果右侧有序那就在右侧寻找。假设左侧有序&#xff0c;那就判断目标值在不在左侧&#xff0c;如果在左侧继续左侧二分。如果不在左侧&#xff0c;那么…

使用aqua data studio进行mysql、oracle、syabse等等debug调试

1、在aqua data studio界面 右击左边空白位置&#xff0c;选择”注册服务器“&#xff0c;弹出框如下&#xff1a; 2、在”一般“里选择使用的数据库&#xff0c;如sybase、mysql, 3、登录成功后&#xff0c;会显示数据库&#xff0c;点击要debug的存储过程

WIFI信号状态信息 CSI 特征提取篇之活动片段提取上(五)

在之前的数据处理环节中&#xff0c;用CSI Tool收集到的原始数据信号&#xff0c;经历了数据解析、降噪、插值的处理步骤&#xff0c;变成了干净、完整的信号片段&#xff0c;这是后续做更进一步分析的基础。 在开始阅读本篇博客前&#xff0c;需要说明两个重要的点&#xff1…

基于SpringBoot + Vue实现的家政服务管理系统设计与实现+毕业论文+答辩PPT+指导搭建视频(包运行成功)

目录 项目介绍 论文展示 资源获取 项目介绍 家政服务管理平台是一个管理信息系统&#xff0c;为了宣传的需要&#xff0c;为了给用户提供方便快捷的服务&#xff0c;从而设计了家政服务管理平台。管理员可以通过这个系统把家政服务信息发布出去&#xff0c;可以方便用户快…

RK3568平台开发系列讲解(Linux系统篇)芯片手册的使用:GPIO的寄存器说明

🚀返回专栏总目录 文章目录 一、查找复用寄存器二、查找方向寄存器三、查找数据寄存器沉淀、分享、成长,让自己和他人都能有所收获!😄 📢寄存器GPIO 进行配置, 一般情况下需要对 GPIO 的复用寄存器, 方向寄存器, 数据寄存器进行配置。 GPIO0_B0 配置为例: 一、查…

《十一》Qt各种对话框之QInputDialog

QInputDialog QInputDialog 用于方便快捷地获取一个用户输入数据&#xff0c;支持整数 int、浮点数 double、文本 QString 三种数据。按照 QInputDialog 内部的输入控件&#xff0c;又可以分为整数输入控件 QSpinBox、浮点数输入控件 QDoubleSpinBox、单行文本输入控件 QLineE…

C++|stack-queue-priority_queue(适配器+模拟实现+仿函数)

目录 一、容器适配器 1.1容器适配器概念的介绍 1.2stack和queue的底层结构 1.3deque容器的介绍 1.3.1deque的缺陷及为何选择他作为stack和queue的底层默认实现 二、stack的介绍和使用 2.1stack的介绍 2.2stack的使用 2.3stack的模拟实现 三、queue的介绍和使用 …

mysql download 2024

好久没在官网下载 mysql server 安装包。今天想下载发现&#xff1a; 我访问mysql官网的速度好慢啊。mysql server 的下载页面在哪里啊&#xff0c;一下两下找不到。 最后&#xff0c;慢慢悠悠终于找到了下载页面&#xff0c;如下&#xff1a; https://dev.mysql.com/downlo…

Qt:学习笔记一

一、工程文件介绍 1.1 main.cpp #include "widget.h" #include <QApplication> // 包含一个应用程序类的头文件 //argc&#xff1a;命令行变量的数量&#xff1b;argv&#xff1a;命令行变量的数组 int main(int argc, char *argv[]) {//a应用程序对象&…

揭示C++设计模式中的实现结构及应用——行为型设计模式

简介 行为型模式&#xff08;Behavioral Pattern&#xff09;是对在不同的对象之间划分责任和算法的抽象化。 行为型模式不仅仅关注类和对象的结构&#xff0c;而且重点关注它们之间的相互作用。 通过行为型模式&#xff0c;可以更加清晰地划分类与对象的职责&#xff0c;并…

使用Umbrello学习工厂模式

工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口&#xff0c; 或者有共同的抽象父类。 当系统扩展需要添加新的产品对象时&#xff0c;仅仅需要添加一个具体对象以及一个具体工厂对 象&#xff0c;原有工厂对象不需要进行任何修改&#xff0c;也不…

小程序设计二

八、使用背景图片&#xff08;background-image) 注意&#xff1a; url不能指定为本地地址可以将图片转化为base64方式使用。使用网络地址&#xff1a; background-image: url(https://img1.baidu.com); 考虑到版权问题&#xff0c;这里没有放具体路径。 使用base64格式指…

【Vue】可拖拽排序表格组件的实现与数据保存

1、描述 使用el-table-draggable组件来创建一个可拖拽的表格。 表格中的数据存储在tableData数组中&#xff0c;每个对象都有sortOrder、id、name和age属性。 当用户拖拽表格行并释放时&#xff0c;handleRowOnEnd方法会被调用&#xff0c; 更新tableData中每个对象的sortO…

SpringBoot 缓存

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 一、缓存的作用二、SpringBoot启用缓存三…

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

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

Express进阶升级

Express进阶升级&#x1f199; 本篇文章&#xff0c;学习记录于&#xff1a;尚硅谷&#x1f3a2; 文章简单学习总结&#xff1a;如有错误 大佬 &#x1f449;点. 前置知识&#xff1a;需要掌握了解&#xff1a; JavaScript基础语法 、Node.JS环境API 、前端工程\模块化、Expr…

nvm基本使用

nvm基本使用 文章目录 nvm基本使用1.基本介绍2.下载地址3.常用指令 1.基本介绍 NVM是一个用于管理 Node.js 版本的工具。它允许您在同一台计算机上同时安装和管理多个 Node.js 版本&#xff0c;针对于不同的项目可能需要不同版本的 Node.js 运行环境。 NVM 主要功能&#xff…

【Redis | 第十篇】Redis与MySQL保证数据一致性(两种解决思路)

文章目录 10.Redis和MySQL如何保证数据一致性10.1双写一致性问题10.2数据高度一致性10.3数据同步允许延时10.3.1中间件通知10.3.2延迟双删 10.Redis和MySQL如何保证数据一致性 10.1双写一致性问题 Redis作为缓存&#xff0c;它是如何与MySQL的数据保持同步的呢&#xff1f;特…