expr.c
学习了Qt基本操作(布局,信号槽等),尝试做一个小的项目:计算器。
参考视频::
计算器的样子模仿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