0924-25,QT的数据类型,实现一个井字棋和计算器(只输入)
目录
day-01
24作业:
01 说明一下Qt生成的项目模板中有哪些文件和文件夹,分别有什么作用?
02 Qt Creator中有哪几个模式,切换的快捷键是什么?
03 如何查看某个Qt内置类的帮助文档,如何查看某个类的源代码?QApplication的继承体系是怎么样的?
04 根据如下ui绘制一个计算器,先不实现计算的功能,只实现显示表达式和编辑表达式的功能
mainwindow.h
main.cpp
mainwindow.cpp
05 QString和std::string和char数组有什么区别?QString增删改查用什么成员函数?
25作业:
01 书写一个函数MyIntersection,可以支持两个相同的QList或者QSet的取交集的操作,返回新集合。书写一个函数MyOdd,可以将一个QMap的所有奇数的键或者是值搜集起来,返回新QList。,int>
02 给出一个路径'/usr/include/dir1/dir2':
03 实现一个井字棋 点击空白按钮可以显示'X'或者'O'
井字棋答案
mainwindow.h
mainwindow.cc
计算器答案
mainwindow.h
mainwindow.cc
day-01
#include "mainwindow.h"#include <stdio.h>
#include <iostream>
#include <QApplication>
#include <QDebug>
#include <QPoint>
#include <QLine>int main(int argc, char *argv[])
{QApplication a(argc, argv);
// MainWindow w;
// w.show();QPoint point(100,200);QPoint p(100,200);qDebug()<<point;QLine l(300,300,100,200);QLine l1(point,p);qDebug()<<l<<l1;char aaa[]="hello 中国";std::string str="hello 中国"; //会被放到最后输出QString qs="hello 中国"; //构造函数进行了编码转换,不适合进行消息传输std::cout<<aaa<<std::endl;std::cout<<str<<std::endl;qDebug()<<qs;//写时复制QString qs1(qs);qDebug()<<"qs data = "<<qs.data_ptr();qDebug()<<"qs data = "<<qs1.data_ptr();qs1[0]='H';qDebug()<<"qs data = "<<qs.data_ptr();qDebug()<<"qs data = "<<qs1.data_ptr();std::string s1="xixi";QString q1=QString::fromStdString(s1);qDebug()<<q1;//格式化构造QString kobe("i am %1 my number is %2 ,second number is %3");qDebug()<<kobe.arg("kobe");qDebug()<<kobe.arg("kobe").arg(8);qDebug()<<kobe.arg("kobe").arg(8).arg(24.3);qDebug()<<kobe;//arg int -QStringint i=1342;QString qi;qi=QString("%1").arg(i,-15,2,QChar('-'));//int a 数字 filewidth最大有效长度/负数左对齐 base进制 fillChar填充//inline QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const//{ return arg(qlonglong(a), fieldWidth, base, fillChar); }qDebug()<<qi;//QString->doubleQString pie="3.12435342534";bool ok;double pied=pie.toDouble(&ok);qDebug()<<"pied= "<<pied<<" ok="<<ok;return a.exec();
}
24作业:
01 说明一下Qt生成的项目模板中有哪些文件和文件夹,分别有什么作用?
1,pro文件,作用类似于makefile,给qmake使用
里面定义了模块,C++文件,库文件,ui文件
2,mainwindow,h mainwindow.cpp 主窗口的声明和实现,包括UI元素和信号槽的实现
3,main.cpp 程序的入口函数,包括两个对象,QApplication(事件循环)和MainWindow(主窗口),主窗口包括三个要素,QMainWindow(父类)UI::MainWindow的指针(由UI文件生成的)和其他自定义的数据成员
5,mainwindow.ui ,ui文件,本质是XML文件,一般用设计者模式编辑
02 Qt Creator中有哪几个模式,切换的快捷键是什么?
ctrl + 1~6
03 如何查看某个Qt内置类的帮助文档,如何查看某个类的源代码?QApplication的继承体系是怎么样的?
Qt内置类的帮助文档 f1
查看某个类的源代码 f2
QApplication的继承体系:
class QApplication : public QGuiApplication class MainWindow : public QMainWindow
04 根据如下ui绘制一个计算器,先不实现计算的功能,只实现显示表达式和编辑表达式的功能
QString的append方法可以追加一个字符
https://raw.githubusercontent.com/liaozhengsong/cpp_picture/main/20240530180746.png
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPushButton>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void do_button_clicked();void on_pushButton_0_clicked();void on_pushButton_1_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_jia_clicked();void on_pushButton_c_clicked();void on_pushButton_chu_clicked();void on_pushButton_cheng_clicked();void on_pushButton_del_clicked();void on_pushButton_jian_clicked();void on_pushButton_dian_clicked();void on_pushButton_deng_clicked();void on_pushButton_010_clicked();private:Ui::MainWindow *ui;QPushButton *button;
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//自己添加的代码必须写在这个函数后面button=new QPushButton("hello",this);QObject::connect(button,SIGNAL(clicked()),this,SLOT(do_button_clicked()));//发送方 //信号 //接收方 //信号槽//注意:转到槽不要调用connect(会调用两次),必须在接收方和发送方都构建之后使用}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::do_button_clicked(){QString text=ui->label-> text();if(text=="hello"||text==""){ui->label->setText("HELLO");}else{ui->label->setText("WORLD");}
}void MainWindow::on_pushButton_0_clicked()
{QString text=ui->label-> text();if(text=="hello"||text==""){ui->label->setText(" ");}else{text.append("0");ui->label->setText(text);}
}
void MainWindow::on_pushButton_1_clicked()
{QString text=ui->label-> text();if(text=="hello"||text==""){ui->label->setText("1");}else{text.append("1");ui->label->setText(text);}
}
void MainWindow::on_pushButton_2_clicked()
{QString text=ui->label-> text();if(text=="hello"){ui->label->setText("2");}else{text.append("2");ui->label->setText(text);}
}
void MainWindow::on_pushButton_3_clicked()
{QString text=ui->label-> text();if(text=="hello"){text.append("3");ui->label->setText("3");}else{text.append("3");ui->label->setText(text);}
}
void MainWindow::on_pushButton_4_clicked()
{QString text=ui->label-> text();if(text=="hello"||text==""){ui->label->setText("4");}else{text.append("4");ui->label->setText(text);}
}
void MainWindow::on_pushButton_5_clicked()
{QString text=ui->label-> text();if(text=="hello"||text==""){ui->label->setText("5");}else{text.append("5");ui->label->setText(text);}
}
void MainWindow::on_pushButton_6_clicked()
{QString text=ui->label-> text();if(text=="hello"||text==""){ui->label->setText("6");}else{text.append("6");ui->label->setText(text);}
}
void MainWindow::on_pushButton_7_clicked()
{QString text=ui->label-> text();if(text=="hello"||text==""){ui->label->setText("7");}else{text.append("7");ui->label->setText(text);}
}
void MainWindow::on_pushButton_8_clicked()
{QString text=ui->label-> text();if(text=="hello"||text==""){ui->label->setText("8");}else{text.append("8");ui->label->setText(text);}
}
void MainWindow::on_pushButton_9_clicked()
{QString text=ui->label-> text();if(text=="hello"||text==""){ui->label->setText("9");}else{text.append("9");ui->label->setText(text);}
}//c 清空
void MainWindow::on_pushButton_c_clicked()
{ui->label->setText(" ");
}void MainWindow::on_pushButton_chu_clicked()
{QString text=ui->label-> text();//非空且最后字符是1if(!text.isEmpty()&&text[text.length()-1].isDigit()){text.append("/");ui->label->setText(text);}else{//不变化ui->label->setText(text);}
}void MainWindow::on_pushButton_cheng_clicked()
{QString text=ui->label-> text();if(!text.isEmpty()&&text[text.length()-1].isDigit()){text.append("*");ui->label->setText(text);}else{//不变化ui->label->setText(text);}
}void MainWindow::on_pushButton_del_clicked()
{QString text=ui->label-> text();//非空if(!text.isEmpty()){text.chop(1);ui->label->setText(text);}
}void MainWindow::on_pushButton_jian_clicked()
{QString text=ui->label-> text();if(!text.isEmpty()&&text[text.length()-1].isDigit()){text.append("-");ui->label->setText(text);}else{//不变化ui->label->setText(text);}
}void MainWindow::on_pushButton_jia_clicked()
{QString text=ui->label-> text();if(!text.isEmpty()&&text[text.length()-1].isDigit()){text.append("+");ui->label->setText(text);}else{//不变化ui->label->setText(text);}
}void MainWindow::on_pushButton_010_clicked()
{QString text=ui->label-> text();if(!text.isEmpty()&&text[text.length()-1].isDigit()){text.append("%");ui->label->setText(text);}else{//不变化ui->label->setText(text);}
}void MainWindow::on_pushButton_dian_clicked()
{QString text=ui->label-> text();if(!text.isEmpty()&&text[text.length()-1].isDigit()){text.append(".");ui->label->setText(text);}else{//不变化ui->label->setText(text);}
}void MainWindow::on_pushButton_deng_clicked()
{QString text=ui->label-> text();if(!text.isEmpty()&&text[text.length()-1].isDigit()){ui->label->setText("result is ...");}//if最后一位是数字,输出 //不是数字,报错}
05 QString和std::string和char数组有什么区别?QString增删改查用什么成员函数?
char数组是结尾字符为‘\0’的字符数组,每个字符都占一个字节,底层编码是ASCII码
std::string是stl的模板容器,处理 ASCII 或 UTF-8 编码的字符串
QString是qt的字符串类,底层的编码方式为utl-16
25作业:
01 书写一个函数MyIntersection,可以支持两个相同的QList或者QSet的取交集的操作,返回新集合。书写一个函数MyOdd,可以将一个QMap<int,int>的所有奇数的键或者是值搜集起来,返回新QList。
#include "mainwindow.h"#include <QApplication>
#include <QDebug>
#include <QList>
#include <QSet>//QList--std::deque QSet--std::unordered set(非序列式容器,哈希,不能重复)//书写一个函数MyIntersection,可以支持两个相同的QList或者QSet的取交集的操作,返回新集合。
template <typename T>
QSet<T> MyIntersection (const QSet<T> & t1,const QSet<T> & t2){//新建容器//遍历t1(遍历t2,相同的元素加入新容器)QSet<T> newset;for(const auto & ele : t1){auto temp=t2.find(ele);if(temp!=t2.end()){newset.insert(ele);}}return newset;
}
template <typename T>
QList<T> MyIntersection (const QList<T> & t1,const QList<T> & t2){//新建容器//遍历t1(遍历t2,相同的元素加入新容器)QSet<T> newset;for(int i=0;i<t1.count();++i){for(int j=0;j<t2.count();++j){if(t1[i]==t2[j]){newset.insert(t1[i]);}}}return QList<T>(newset.begin(),newset.end());
}//书写一个函数MyOdd,可以将一个QMap<int,int>的所有奇数的键或者是值搜集起来,返回新QList。
QList<int> MyOdd(const QMap<int,int> & m1){QSet<int> s1;for(auto & ele:m1.keys()){if(ele&1){s1.insert(ele);}if(m1.value(ele)&1){s1.insert(m1.value(ele));}}return QList<int>(s1.begin(),s1.end());
}int main(int argc, char *argv[])
{QApplication a(argc, argv);//MainWindow w;//w.show();//QList--std::deque QSet--std::unordered set(非序列式容器,哈希,不能重复)QList<int> l1{1,4,3,2,5,7,8,3,2,245};QList<int> l2{3,7,3,3,2,2,5,7};QList<int> ll=MyIntersection(l1,l2);qDebug()<<ll;QSet<int> s1{1,4,3,2,5,7,8,3,2,245};QSet<int> s2{3,7,3,3,2,2,5,7};QSet<int> ss=MyIntersection(s1,s2);qDebug()<<ss;//书写一个函数MyOdd,可以将一个QMap<int,int>的所有奇数的键或者是值搜集起来,返回新QList。QMap<int,int> m1{{3,2},{4,5},{0,9},{1,3}};QList<int> lm1=MyOdd(m1);qDebug()<<lm1;return a.exec();
}
02 给出一个路径'/usr/include/dir1/dir2':
- 将路径切割并存入一个栈中。
- 实现cd 子目录和cd 上一级功能,返回路径的字符串。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStack>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();QStack<QString> creater(QString s1);private slots:void on_pushButton_cd_clicked();void on_pushButton_cdfront_clicked();private:Ui::MainWindow *ui;QStack<QString> s1;};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QString ss1("/usr/include/dir1/dir2");s1=creater(ss1);
}MainWindow::~MainWindow()
{delete ui;
}QStack<QString> MainWindow::creater(QString s1){QStack<QString> mys;QStringList lisarr=s1.split("/",QString::SkipEmptyParts);for(int i=0;i<lisarr.size();++i){mys.push(lisarr[i]);}return mys;}//给出一个路径'/usr/include/dir1/dir2':
//将路径切割并存入一个栈中。
//实现cd 子目录和cd 上一级功能,返回路径的字符串void MainWindow::on_pushButton_cd_clicked()
{
//打开子目录-->/uer 只有一个/ for()QString txt=ui->index_1->toPlainText();int index1=txt.count('/');QString t;if(index1<=3){for(int i=0;i<index1+1;++i){// /uer->/usr/includet.append('/').append(s1.at(i));}ui->index_1->setText(t);}else{for(int i=0;i<4;++i){t.append('/').append(s1.at(i));}ui->index_1->setText(t);}}void MainWindow::on_pushButton_cdfront_clicked()
{QString txt=ui->index_1->toPlainText();int index1=txt.count('/');QString t;if(index1<=4){for(int i=0;i<index1-1;++i){t.append('/').append(s1.at(i));}ui->index_1->setText(t);}else{for(int i=0;i<4;++i){t.append('/').append(s1.at(i));}ui->index_1->setText(t);}
}
03 实现一个井字棋 点击空白按钮可以显示'X'或者'O'
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_12_clicked()
{QString txt=ui->pushButton_12->text();if(txt.isEmpty()){ui->pushButton_12->setText("X");}else if(txt=="X"){ui->pushButton_12->setText("O");}else{ui->pushButton_12->setText("");}}void MainWindow::on_pushButton_18_clicked()
{QString txt=ui->pushButton_18->text();if(txt.isEmpty()){ui->pushButton_18->setText("X");}else if(txt=="X"){ui->pushButton_18->setText("O");}else{ui->pushButton_18->setText("");}
}void MainWindow::on_pushButton_13_clicked()
{QString txt=ui->pushButton_13->text();if(txt.isEmpty()){ui->pushButton_13->setText("X");}else if(txt=="X"){ui->pushButton_13->setText("O");}else{ui->pushButton_13->setText("");}
}void MainWindow::on_pushButton_11_clicked()
{QString txt=ui->pushButton_11->text();if(txt.isEmpty()){ui->pushButton_11->setText("X");}else if(txt=="X"){ui->pushButton_11->setText("O");}else{ui->pushButton_11->setText("");}
}void MainWindow::on_pushButton_10_clicked()
{QString txt=ui->pushButton_10->text();if(txt.isEmpty()){ui->pushButton_10->setText("X");}else if(txt=="X"){ui->pushButton_10->setText("O");}else{ui->pushButton_10->setText("");}
}void MainWindow::on_pushButton_14_clicked()
{QString txt=ui->pushButton_14->text();if(txt.isEmpty()){ui->pushButton_14->setText("X");}else if(txt=="X"){ui->pushButton_14->setText("O");}else{ui->pushButton_14->setText("");}
}void MainWindow::on_pushButton_17_clicked()
{QString txt=ui->pushButton_17->text();if(txt.isEmpty()){ui->pushButton_17->setText("X");}else if(txt=="X"){ui->pushButton_17->setText("O");}else{ui->pushButton_17->setText("");}
}void MainWindow::on_pushButton_15_clicked()
{QString txt=ui->pushButton_15->text();if(txt.isEmpty()){ui->pushButton_15->setText("X");}else if(txt=="X"){ui->pushButton_15->setText("O");}else{ui->pushButton_15->setText("");}
}void MainWindow::on_pushButton_16_clicked()
{QString txt=ui->pushButton_16->text();if(txt.isEmpty()){ui->pushButton_16->setText("X");}else if(txt=="X"){ui->pushButton_16->setText("O");}else{ui->pushButton_16->setText("");}
}void MainWindow::on_pushButton_clear_clicked()
{ui->pushButton_16->setText("");ui->pushButton_15->setText("");ui->pushButton_17->setText("");ui->pushButton_12->setText("");ui->pushButton_18->setText("");ui->pushButton_13->setText("");ui->pushButton_11->setText("");ui->pushButton_10->setText("");ui->pushButton_14->setText("");
}
井字棋答案
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtWidgets/QtWidgets>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_1_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_clearBtn_clicked();//清屏 void on_undoBtn_clicked();//回退 private:Ui::MainWindow *ui;QList<QPushButton *> buttonList;//QPushButton 按钮deque QStack<int> opStack; //操作栈 -->回退 QString currentUser; //当前内容
};
#endif // MAINWINDOW_H
mainwindow.cc
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);buttonList << ui->pushButton_1<< ui->pushButton_2<< ui->pushButton_3<< ui->pushButton_4<< ui->pushButton_5<< ui->pushButton_6<< ui->pushButton_7<< ui->pushButton_8<< ui->pushButton_9;//链式调用 on_clearBtn_clicked();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_1_clicked()
{//检查按钮内容是否为空,不为空,返回不执行下面的操作//避免反悔 if(!ui->pushButton_1->text().isEmpty()){return;}ui->pushButton_1->setText(currentUser);if(currentUser == "O"){currentUser = "X";}else{currentUser = "O";}opStack.push(0);//stack.push 压栈
}
void MainWindow::on_pushButton_2_clicked()
{if(!ui->pushButton_2->text().isEmpty()){return;}ui->pushButton_2->setText(currentUser);if(currentUser == "O"){currentUser = "X";}else{currentUser = "O";}opStack.push(1);
}
void MainWindow::on_pushButton_3_clicked()
{if(!ui->pushButton_3->text().isEmpty()){return;}ui->pushButton_3->setText(currentUser);if(currentUser == "O"){currentUser = "X";}else{currentUser = "O";}opStack.push(2);
}
void MainWindow::on_pushButton_4_clicked()
{if(!ui->pushButton_4->text().isEmpty()){return;}ui->pushButton_4->setText(currentUser);if(currentUser == "O"){currentUser = "X";}else{currentUser = "O";}opStack.push(3);
}
void MainWindow::on_pushButton_5_clicked()
{if(!ui->pushButton_5->text().isEmpty()){return;}ui->pushButton_5->setText(currentUser);if(currentUser == "O"){currentUser = "X";}else{currentUser = "O";}opStack.push(4);
}
void MainWindow::on_pushButton_6_clicked()
{if(!ui->pushButton_6->text().isEmpty()){return;}ui->pushButton_6->setText(currentUser);if(currentUser == "O"){currentUser = "X";}else{currentUser = "O";}opStack.push(5);
}
void MainWindow::on_pushButton_7_clicked()
{if(!ui->pushButton_7->text().isEmpty()){return;}ui->pushButton_7->setText(currentUser);if(currentUser == "O"){currentUser = "X";}else{currentUser = "O";}opStack.push(6);
}
void MainWindow::on_pushButton_8_clicked()
{if(!ui->pushButton_8->text().isEmpty()){return;}ui->pushButton_8->setText(currentUser);if(currentUser == "O"){currentUser = "X";}else{currentUser = "O";}opStack.push(7);
}
void MainWindow::on_pushButton_9_clicked()
{if(!ui->pushButton_9->text().isEmpty()){return;}ui->pushButton_9->setText(currentUser);if(currentUser == "O"){currentUser = "X";}else{currentUser = "O";}opStack.push(8);
}
void MainWindow::on_clearBtn_clicked()
{for(int i = 0; i < buttonList.size(); ++i){buttonList[i]->setText("");}currentUser = "O";opStack.clear();
}void MainWindow::on_undoBtn_clicked()
{if(opStack.empty()){return;}int top = opStack.top();opStack.pop();buttonList[top]->setText("");if(currentUser == "O"){ //切换当前用户-->正确的玩家 currentUser = "X";}else{currentUser = "O";}
}
计算器答案
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_btn1_clicked();void on_btn2_clicked();void on_btn3_clicked();void on_btn4_clicked();void on_btn5_clicked();void on_btn6_clicked();void on_btn7_clicked();void on_btn8_clicked();void on_btn9_clicked();void on_btn0_clicked();void on_btnplus_clicked();void on_btnminus_clicked();void on_btnmultiply_clicked();void on_btndivide_clicked();void on_btndel_clicked();
private:Ui::MainWindow *ui;QString _current_expression; // 褰撳墠鐨勮〃杈惧紡鍐呭bool _is_expression_valid; // 鏄惁瀛樺湪宸茬粡杈撳叆鐨勮〃杈惧紡void _check_and_clear(); // 妫€鏌ヨ〃杈惧紡锛岃嫢鏃犲凡杈撳叆鍐呭鍒欐竻绌?bool _check_operator_valid(); //妫€鏌ユ槸鍚﹀彲浠ヨ緭鍏ヨ繍绠楃
// QString current expression; //当前的表达式内容
// bool is expression valid; //是否存在已经输入的表达式
// void check and clear0; // 检查表达式,若无已输入内容则清空
// bool check operator valid0; //检查是否可以输入运算符
};
#endif // MAINWINDOW_H
mainwindow.cc
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow),_current_expression("please input..."),_is_expression_valid(false)
{ui->setupUi(this);ui->label->setText(_current_expression);
}MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::_check_and_clear(){if(!_is_expression_valid){_current_expression.clear();_is_expression_valid = true;}
}
bool MainWindow::_check_operator_valid(){if(_is_expression_valid && _current_expression.back().isNumber()){return true;}return false;
}
void MainWindow::on_btn1_clicked()
{_check_and_clear();_current_expression.append("1");ui->label->setText(_current_expression);
}
void MainWindow::on_btn2_clicked()
{_check_and_clear();_current_expression.append("2");ui->label->setText(_current_expression);
}
void MainWindow::on_btn3_clicked()
{_check_and_clear();_current_expression.append("3");ui->label->setText(_current_expression);
}
void MainWindow::on_btn4_clicked()
{_check_and_clear();_current_expression.append("4");ui->label->setText(_current_expression);
}
void MainWindow::on_btn5_clicked()
{_check_and_clear();_current_expression.append("5");ui->label->setText(_current_expression);
}
void MainWindow::on_btn6_clicked()
{_check_and_clear();_current_expression.append("6");ui->label->setText(_current_expression);
}
void MainWindow::on_btn7_clicked()
{_check_and_clear();_current_expression.append("7");ui->label->setText(_current_expression);
}
void MainWindow::on_btn8_clicked()
{_check_and_clear();_current_expression.append("8");ui->label->setText(_current_expression);
}
void MainWindow::on_btn9_clicked()
{_check_and_clear();_current_expression.append("9");ui->label->setText(_current_expression);
}
void MainWindow::on_btn0_clicked()
{_check_and_clear();_current_expression.append("0");ui->label->setText(_current_expression);
}
void MainWindow::on_btnplus_clicked()
{if(_check_operator_valid()){_current_expression.append("+");ui->label->setText(_current_expression);}
}void MainWindow::on_btnminus_clicked()
{if(_check_operator_valid()){_current_expression.append("-");ui->label->setText(_current_expression);}
}void MainWindow::on_btnmultiply_clicked()
{if(_check_operator_valid()){_current_expression.append("*");ui->label->setText(_current_expression);}
}void MainWindow::on_btndivide_clicked()
{if(_check_operator_valid()){_current_expression.append("/");ui->label->setText(_current_expression);}
}void MainWindow::on_btndel_clicked()
{if(_is_expression_valid){_current_expression.chop(1);if(_current_expression.size() == 0){_is_expression_valid = false;_current_expression = "please input...";}ui->label->setText(_current_expression);}
}