QT——简易计算机(从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文件目录

比如:

运行完毕

七、实现效果

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

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

相关文章

Linux(Centos 7)环境下安装wget,并且更换阿里云镜像

Linux(Centos 7) Minimal 安装后&#xff0c;由于没有预装wget&#xff0c;在使用wget命令去下载安装相关应用时&#xff0c;提示&#xff1a;“wget: command not found” 先在Linux服务器窗口中&#xff0c;输入如下命令&#xff0c;检查Linux服务器有没有安装过wget。 rpm -…

【网站项目】戒烟网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

如何在Linux上安装Python?2024Python安装教程

在Linux上安装Python并不难&#xff0c;对于Ubuntu或Debian系统&#xff0c;使用命令sudo apt install python3&#xff1b;对于CentOS、Red Hat或Fedora系统&#xff0c;使用命令sudo yum install python3。 如何在Linux上安装Python&#xff1f; 确切的安装步骤有所不同&am…

【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解

一、线程概念 线程是进程的一个执行分支&#xff0c;是在进程内部运行的一个执行流。下面将从是什么、为什么、怎么办三个角度来解释线程。 1、什么是线程 上面是一张用户级页表&#xff0c;我们都知道可执行程序在磁盘中无非就是代码或数据&#xff0c;更准确点表述&#xff0…

Python基础学习之记录中间文件

倘若想记录代码运行过程中的结果文件&#xff0c;那么以下函数仅供参考 代码示例&#xff1a; import os import datetime import sys import pandas as pd# 定义总的文件夹路径 base_folder E:\\D\\log\\product_data_compare_log# 定义一个函数来创建带时间戳的文件夹 def…

Python量化炒股的财务因子选股

Python量化炒股的财务因子选股-财务因子选股 选股是股市投资的第一步&#xff0c;是最基础的一步&#xff0c;也是最重要的一步。 初识财务因子选股 量化选股是利用数量化的方法选择股票组合&#xff0c;期望该股票组合能够获得超越基准收益率的投资行为。总的来说&#xff…

el-tabs作为子组件使用页面空白

文章目录 前言一、问题展示二、源码分析三、解决方案 前言 如果el-tabs是子组件&#xff0c;父组件传值value / v-model为空字符&#xff0c;这个时候在watch中监听value / v-model就会发现监听的数据会被调用为‘0’。一定是作为子组件引用&#xff0c;且在watch进行监听&…

【webrtc】MessageHandler 7: 基于线程的消息处理:切换main线程向observer发出通知

以当前线程作为main线程 RemoteAudioSource 作为一个handler 仅实现一个退出清理的功能 首先on message的处理会切换到main 线程 :main_thread_其次,这里在main 线程对sink_ 做清理再次,在main 线程做出状态改变,并能通知给所有的observer 做出on changed 行为。对接mediac…

OpenNJet : 下一代云原生应用引擎

本心、输入输出、结果 文章目录 OpenNJet &#xff1a; 下一代云原生应用引擎前言OpenNJet 技术架构安装 OpenNJet为什么有了 OpenNJetOpenNJet 和 NGINX 是什么关系什么是云原生应用引擎&#xff1f;OpenNJet 的有哪些优势OpenNJet 的有哪些优势 OpenNJet 与国产化OpenNJet 使…

【团体程序设计天梯赛】往年关键真题 L2-036 网红点打卡攻略 模拟 L2-037 包装机 栈和队列 详细分析完整AC代码

【团体程序设计天梯赛 往年关键真题 详细分析&完整AC代码】搞懂了赛场上拿下就稳 【团体程序设计天梯赛 往年关键真题 25分题合集 详细分析&完整AC代码】&#xff08;L2-001 - L2-024&#xff09;搞懂了赛场上拿下就稳了 【团体程序设计天梯赛 往年关键真题 25分题合…

初学React基础

最近准备跟着黑马React学一下React&#xff0c;扩充一下技术面&#xff0c;打算还是以一边学习一边记笔记为主&#xff0c;进行学习&#xff01; 1. React介绍 1.1. React是什么&#xff1f; React是由FaceBook现在称&#xff08;Meta&#xff09;开发的开源 JavaScript 库&a…

SpringCloudStream 3.x rabbit 使用

1. 前言 今天带来的是SpringCloudStream 3.x 的新玩法&#xff0c;通过四大函数式接口的方式进行数据的发送和监听。本文将通过 rabbitMQ 的方式进行演示 3.x版本后是 可以看到 StreamListener 和 EnableBinding 都打上了Deprecated 注解。后续的版本更新中会逐渐替换成函数式…

如何批量修改文件的时间属性?修改创建时间,修改时间和访问时间

一&#xff0c;前言 在Excel中&#xff0c;修改文件的访问时间、创建时间和修改时间通常不是一个直接的功能。但是&#xff0c;我们可以通过一些间接的方法和工具来实现这一目标。请注意&#xff0c;直接修改这些时间戳可能会影响文件的完整性和安全性&#xff0c;因此在进行任…

Python 与 TensorFlow2 生成式 AI(四)

原文&#xff1a;zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第九章&#xff1a;文本生成方法的崛起 在前几章中&#xff0c;我们讨论了不同的方法和技术来开发和训练生成模型。特别是在第六章“使用 …

WIN10 anaconda 安装 CondaError: Run ‘conda init‘ before ‘conda activate‘

1 下载 https://www.anaconda.com/download/success 2 安装 3 修改环境变量 安装后修改环境变量 4 winrun 进入命令窗口 输入cmd 输入 conda info 5 创建 虚拟环境 conda create -n yolov8 python3.8 -y 6 CondaError: Run ‘conda init’ before ‘conda activate’ c…

[Java、Android面试]_24_Compose为什么绘制要比XML快?(高频问答)

欢迎查看合集&#xff1a; Java、Android面试高频系列文章合集 本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&am…

GPT3 终极指南(二)

原文&#xff1a;zh.annas-archive.org/md5/6de8906c86a2711a5a84c839bec7e073 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第五章&#xff1a;GPT-3 作为企业创新的下一步 当一个新的创新或技术转变发生时&#xff0c;大公司通常是最后一个采纳的。它们的等级结构…

将聊天记录与 LangChain 集成:为提升对话机器人体验提供了一种变革性的解决方案

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

PVDF-SiO₂复合纳米纤维膜

PVDF-SiO₂复合纳米纤维膜是一种结合了聚偏氟乙烯&#xff08;PVDF&#xff09;和二氧化硅&#xff08;SiO₂&#xff09;纳米粒子的新型复合材料。这种材料通常通过静电纺丝技术或其他纤维制备技术制备而成&#xff0c;具有许多良好的性能和广泛的应用前景。 PVDF是一种热塑性…

final、finally、finalize有什么区别?

引言 在Java编程语言中&#xff0c;final、finally和finalize是三个具有不同用途和语义的关键字或方法。它们在编程和面试中经常被提及&#xff0c;因此理解它们之间的区别是非常重要的。 题目 final、finally、 finalize有什么区别&#xff1f; 典型回答 final&#xff1…