expr.c
学习了Qt基本操作(布局,信号槽等),尝试做一个小的项目:计算器。
参考视频::
https://study.163.com/course/courseLearn.htm?courseId=1005069007#/learn/video?lessonId=1051536137&courseId=1005069007
。
计算器的样子模仿Windows自带的计算器,但是简化了一些。
(Windows自带计算器)
一、创建工程:
打开Qt Creator
点击New Project 创建工程。
选择Qt Widgets Application,点击Choose,
按照提示,填写名称和路径,然后下一步。
选择这个 Desktop开头的,然后下一步。
选择基类是QDialog,类名为expr.(或者自己取名)
然后下一步。
然后点完成。
程序创建好了。
二、界面设计
双击后缀为.ui的文件,进入设计界面。
我们在这里进行布局。
模仿windows系统自带计算器,我们设计的计算器的界面为:
设计界面的操作比较简单:上面是一个Label,用于显示,
下面是4x4的按钮区(Push Button)。
设置好界面后,为了方便后面的操作,我们要修改它们的名字。
例如按钮C:功能是清除,名字就改成btn_clear.
三、模型代码
右击我们的项目,选择添加新文件,C++,C++ Class。
然后类名就叫model,
model.h
#ifndef MODEL_H #define MODEL_H #include<QString> class model { public: model(); //设置数字 void setNum1(int num); void setNum2(int num); //设置符号 void setFlag(QString flag); //计算 int doExpr(); private: //用于计算的2个数字num1,num2,符号flag int num1; int num2; QString flag; }; #endif // MODEL_H
model.cpp
#include "model.h" model::model() { } void model::setNum1(int num) { num1 = num; } void model::setNum2(int num) { num2 = num; } void model::setFlag(QString flag) { this->flag = flag; } int model::doExpr() { int result = 0; if(flag == "+") result = num1+num2; else if(flag == "-") result = num1-num2; else if (flag == "*") result = num1*num2; else if(flag == "/") { if(num2 == 0) return "Error"; else result = num1 / num2; } return result; }
四、控制器代码
将模型和界面(在窗口初始化时,即expr的构造函数中)连接起来。 方式: 信号槽
需要连接的东西:
当按下数字键0-9 时,获取数字。
例如:
connect(this->ui->btn_0, SIGNAL(clicked(bool)),this,SLOT(getBtn0()) );
或者直接在界面设计的地方点击按钮--转到槽,写槽函数。
以下是相关源码
expr.h
#ifndef EXPR_H #define EXPR_H #include<QString> #include <QDialog> #include"model.h" namespace Ui { class expr; } class expr : public QDialog { Q_OBJECT public: explicit expr(QWidget *parent = 0); ~expr(); private slots: void getBtn0(); void getBtn1(); void getBtn2(); void on_btn_3_clicked(); void on_btn_4_clicked(); void on_btn_5_clicked(); void on_btn_6_clicked(); void on_btn_7_clicked(); void on_btn_8_clicked(); void on_btn_9_clicked(); void on_btn_plus_clicked(); void on_btn_sub_clicked(); void on_btn_mult_clicked(); void on_btn_divid_clicked(); void on_btn_equal_clicked(); void on_btn_clear_clicked(); private: Ui::expr *ui; QString tmp; model * model1; }; #endif // EXPR_H
expr.c
#include "expr.h" #include "ui_expr.h" #include"model.h" expr::expr(QWidget *parent) : QDialog(parent), ui(new Ui::expr) { model1 = new model; ui->setupUi(this); connect(this->ui->btn_0, SIGNAL(clicked(bool)),this,SLOT(getBtn0()) ); connect(this->ui->btn_1, SIGNAL(clicked(bool)),this, SLOT(getBtn1())); connect(this->ui->btn_2, SIGNAL(clicked(bool)),this, SLOT(getBtn2())); tmp = ""; } expr::~expr() { delete ui; } void expr::getBtn0() { if(tmp != "") { tmp +=this->ui->btn_0->text(); this->ui->lbl_display->setText(tmp); } } void expr::getBtn1() { tmp +=this->ui->btn_1->text(); this->ui->lbl_display->setText(tmp); } void expr::getBtn2() { tmp +=this->ui->btn_2->text(); this->ui->lbl_display->setText(tmp); } void expr::on_btn_3_clicked() { tmp +=this->ui->btn_3->text(); this->ui->lbl_display->setText(tmp); } void expr::on_btn_4_clicked() { tmp +=this->ui->btn_4->text(); this->ui->lbl_display->setText(tmp); } void expr::on_btn_5_clicked() { tmp +=this->ui->btn_5->text(); this->ui->lbl_display->setText(tmp); } void expr::on_btn_6_clicked() { tmp +=this->ui->btn_6->text(); this->ui->lbl_display->setText(tmp); } void expr::on_btn_7_clicked() { tmp +=this->ui->btn_7->text(); this->ui->lbl_display->setText(tmp); } void expr::on_btn_8_clicked() { tmp +=this->ui->btn_8->text(); this->ui->lbl_display->setText(tmp); } void expr::on_btn_9_clicked() { tmp +=this->ui->btn_9->text(); this->ui->lbl_display->setText(tmp); } void expr::on_btn_plus_clicked() { int num = tmp.toInt(); model1->setNum1(num); tmp = ""; QString ex = ui->btn_plus->text(); model1->setFlag(ex); } void expr::on_btn_sub_clicked() { int num = tmp.toInt(); model1->setNum1(num); tmp = ""; QString ex = ui->btn_sub->text(); model1->setFlag(ex); } void expr::on_btn_mult_clicked() { int num = tmp.toInt(); model1->setNum1(num); tmp = ""; QString ex = ui->btn_mult->text(); model1->setFlag(ex); } void expr::on_btn_divid_clicked() { int num = tmp.toInt(); model1->setNum1(num); tmp = ""; QString ex = ui->btn_divid->text(); model1->setFlag(ex); } void expr::on_btn_equal_clicked() { int num = tmp.toInt(); model1->setNum2(num); QString res = model1->doExpr(); ui->lbl_display->setText(res); tmp = ""; } void expr::on_btn_clear_clicked() { tmp = ""; ui->lbl_display->setText("0"); }
做这个项目的步骤:
1.设计界面V
2.模型M
3.控制C