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

news2024/11/17 1:29:20

目录

一、题目描述:

二、创建工程:

三、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.coloradmin.cn/o/1637784.html

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

相关文章

ctfshow-web入门-102

这个题我想记录一下&#xff0c;主要是这个方法属实是有点惊艳到我了。故而进行记录&#xff0c;也为了方便大家阅读理解。 看题目&#xff0c;根据题目我写一下我的分析&#xff1a; $_POST传入一个v1&#xff0c;$_GET传入一个v2&#xff0c;一个v3。 赋值符号 优先级高于…

谷粒商城实战(021 业务-订单模块-页面设计)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第262p-第p266的内容 介绍 所需的页面 设计页面 新增域名 路径带/static的都到/usr/share/nginx/html文件夹下去找 其他动态请求的都负载…

2024年第二十一届 五一杯 (C题)大学生数学建模挑战赛 | 多目标优化问题,深度学习分析 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是五一杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 首先&…

Mac M2 本地下载 Xinference

想要在Mac M2 上部署一个本地的模型。看到了Xinference 这个工具 一、Xorbits Inference 是什么 Xorbits Inference&#xff08;Xinference&#xff09;是一个性能强大且功能全面的分布式推理框架。可用于大语言模型&#xff08;LLM&#xff09;&#xff0c;语音识别模型&…

【已解决】pandas读excel中长数字变成科学计数法的问题

pandas 读excel中的长数字时&#xff0c;即使excel中已经设置为文本&#xff0c;读进df后也会自动变成科学计数法。 在日常的数据分析和处理工作中&#xff0c;Excel和pandas是数据分析师们不可或缺的得力助手。然而&#xff0c;在使用pandas读取Excel文件时&#xff0c;我们有…

基于残差神经网络的汉字识别系统+pyqt前段界面设计

研究内容: 中文汉字识别是一项具有挑战性的任务&#xff0c;涉及到对中文字符的准确分类。在这个项目中&#xff0c;目标是构建一个能够准确识别中文汉字的系统。这个任务涉及到数据集的收集、预处理、模型训练和评估等步骤。尝试了使用残差神经网络&#xff08;ResNet&#x…

Rust Rocket创建第一个hello world的Web程序 Rust Rocket开发常用网址和Rust常用命令

一、Rust Rocket简介 Rust Rocket 是一个用 Rust 语言编写的 Web 应用框架&#xff0c;它结合了 Rust 的安全性和性能优势&#xff0c;以及 Web 开发的便利性。以下是 Rust Rocket 框架的一些优点&#xff1a; 安全性&#xff1a;Rust 是一种注重安全性的编程语言&#xff0c;…

【前端探索者:从零到精通的Web前端实战专栏】

🚀 在这个代码编织梦想的时代,Web前端作为互联网的颜值担当,正以日新月异的速度重塑数字世界。想要在前端江湖里游刃有余,你需要的不仅仅是一把锋利的剑,更是一套完整的武功秘籍!今天,我们就为你揭开【Web前端】专栏的神秘面纱,带你从菜鸟到大神,一飞冲天! 📚 专栏…

Text-to-SQL小白入门(12)Awesome-Text2SQL开源项目star破1000

项目介绍 项目地址 23年9月份刚开源这个项目&#xff0c;大半年过去了&#xff0c;star数终于破1000啦&#xff0c;决定在知乎更新一下内容&#xff0c;看看内容变化&#xff0c;知乎有上当时项目介绍的链接&#xff1a;追光者&#xff1a;Text-to-SQL小白入门&#xff08;六&…

【Qt QML】Frame组件

Frame&#xff08;框架&#xff09;包含在&#xff1a; import QtQuick.Controls继承自Pane控件。用于在可视框架内布局一组逻辑控件。简单来说就是用来包裹和突出显示其他可视元素。Frame不提供自己的布局&#xff0c;但需要自己对元素位置进行设置和定位&#xff0c;例如通过…

Spring Boot Admin

概述 Spirng Boot Admin 登录页面 Spring Boot Admin是一个用于管理Spring Boot应用的监控工具,它允许你查看和管理多个Spring Boot应用实例。用于应用信息进行界面化的展示&#xff0c;常常辅助我们开发人员快速查看服务运行状态在微服务架构中&#xff0c;Spring Boot Admin通…

【linux】进程(深入理解linux进程状态)

开始之前先说一个与本文无关的小知识&#xff0c;chdir命令可以更改当前进程的工作目录哦。 目录 linux具体进程状态&#xff1a;R && S&#xff1a;T && t&#xff1a;D&#xff1a;僵尸进程 && 孤儿进程&#xff1a; OS的理论线&#xff1a;运行&…

JMeter性能压测脚本录制

第一步&#xff1a;电脑打开控制面板设置代理服务器 第二步&#xff1a;jmeter的测试计划添加一个HTTP&#xff08;S&#xff09;脚本记录器 在脚本记录器里配置好信息&#xff0c;然后保存为脚本文件&#xff08;.*表示限定&#xff09; 此方框内容为项目地址&#xff08;可改…

如何安装cuda版本的torch-sparse和torch-scatter

安装对应cuda版本的torch&#xff0c;确保cuda可用 使用nvidia-smi查看cuda版本&#xff0c;我的是11.4&#xff0c;然后就找到pytorch历史版本&#xff0c;页面搜索cuda 11.4&#xff0c;没搜到&#xff0c;继续往小版本搜&#xff0c;搜到cuda 11.3&#xff0c;果断安装&…

日拱一卒,月进一步(10)

303. 区域和检索 - 数组不可变 - 力扣&#xff08;LeetCode&#xff09; 动态规划~ 前缀和 最朴素的思想是存储数组nums的值&#xff0c;每次调用sumRange时&#xff0c;通过循环的方法计算数组nums从下标i到下标j的元素和&#xff0c;需要计算j-i1个元素的和。由于每次检索…

Sobel算法:边缘提取的原理与实践【基于python、C++基于opencv的代码实现!!】

Sobel算法&#xff1a;深入解析边缘检测的原理与实现 在图像处理领域&#xff0c;边缘检测是一项至关重要的任务。其中&#xff0c;Sobel算法以其高效和稳定的性能&#xff0c;成为边缘检测中的常用方法之一。本文将深入解析Sobel算法的原理与实现&#xff0c;带您了解如何通过…

02_机器学习算法_基于XGBoost的分类预测

1. XGBoost 算法 1.1 XGBoost 的介绍 XGBoost是2016年由华盛顿大学陈天奇老师带领开发的一个可扩展机器学习系统。严格意义上讲XGBoost并不是一种模型,而是一个可供用户轻松解决分类、回归或排序问题的软件包。它内部实现了梯度提升树(GBDT)模型,并对模型中的算法进行了诸多…

通过先序和中序求后序(通过后序和中序求先序)

一、通过先序和中序求后序 二、通过后序和中序求后序 1、利用后序和中序的特点来求出二叉树 2、后序输出二叉树 如图&#xff0c;先给了一个后序和中序&#xff0c;后序的最后一个为根节点 然后在中序中查找相同的元素&#xff0c;在这个元素左边的为左子树&#xff0c;右…

最简方式安装oracle 23c free

简介 我一直认为&#xff0c;最靠谱的文档就是原厂官网的文档&#xff0c;阅读再次加工的文档都有可能把你带偏。 oracle官网提供了大量的文档&#xff0c;一个好的oracle使用者&#xff0c;应该首先是好的oracle官网阅读者。 oracle数据库作为收费颇贵的商业数据库软件&#…

C++ 优先级队列priority_queue

1、常用接口 底层使用的是堆实现&#xff0c;默认为大堆 2、理解&#xff1a; 优先级队列就是即使插入的是一个乱序的&#xff0c;但是依旧会按照有序的顺序出队列 优先级队列就是会根据大小来出队列&#xff0c;而不是谁在队头就出谁。 优先级队列底层是使用堆实现&#x…