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

1 篇文章 0 订阅

目录

一、题目描述:

二、创建工程:

三、UI界面设计:

四、程序编写:

五、总程序:

六、windows可执行文件

七、实现效果


一、题目描述:

        创建一个简单的图形用户界面(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文件目录

比如:

运行完毕

七、实现效果

  • 34
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0X78

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值