目录
一、题目描述:
二、创建工程:
三、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文件目录
比如:
运行完毕