这次我们来做一个小案例,这个案例算是比较有特色的就是计算器了,我们采用MVC的方式来实现
效果还是比较满意的
实际上算了一下 大小然后再UI中可以设置指定的大小,就不会变形了,因为我们这个也不是主Window,而是一个Dialog
我们先来说下我们使用的MVC架构,实际上,我们默认的UI文件,他就是View,也就是我们所说的界面,那么默认创建的UI源文件,就是C了也就是控制类,而M呢,就需要我们自己去实现以下了,也就是Model类,实现一些基本的计算方法
而我们的View这一块布局,大家就自己去写就好了,因为可以拖动的,当然,我也会上传源码供大家下载,我们主要来看下我们的开发流程
我们这里首先考虑的是控件,因为我们只是一个小窗口,所以这里我选择了QDialog
然后我们创建一个CalculatorModel的C++类来处理逻辑
#ifndef CALCULATORMODEL_H
#define CALCULATORMODEL_H
#include
//公开的运算的方法: num1 + num2
class CalculatorModel
{
public:
CalculatorModel();
//函数
void setNum1(int num);
void setNum2(int num);
void setFlag(QString flag);
//开始计算
QString doCalculator();
private:
//变量
int num1;
int num2;
QString flag;
};
#endif // CALCULATORMODEL_H
你可以看到,这个类实际上并没有做什么过多的操作,只是定义了三个变量分别是num1和num2的数字以及QString的结果并且声明了4个公开的方法,而在我们对应的源代码中
#include "calculatormodel.h"
CalculatorModel::CalculatorModel()
{
//init
this->num1 = 0;
this->num2 = 0;
}
//设置属性参数
void CalculatorModel::setNum1(int num)
{
this->num1 = num;
}
void CalculatorModel::setNum2(int num)
{
this->num2 = num;
}
void CalculatorModel::setFlag(QString flag)
{
this->flag = flag;
}
QString CalculatorModel::doCalculator()
{
int result = 0;
if(this->flag == "+")
{
result = this->num1 + this->num2;
}
else if(this->flag == "-")
{
result = this->num1 - this->num2;
}
else if(this->flag == "*")
{
result = this->num1 * this->num2;
}
else if(this->flag == "/")
{
//除数不能为0
if(this->num2 == 0)
{
return "error";
}
result = this->num1 / this->num2;
}
else
{
return QString::number(this->num1);
}
return QString::number(result);
}
这里构造函数中先初始化了num1和2,然后对应的set方法中赋值即可,主要还是doCalculator这个计算的方法,在这里我们定义了一个中间变量relust并且判断了运算方法来获取结果,这里考虑了几个逻辑
这里用到了int转string,使用的是QString的静态函数number
好,这是model类,回过头来看我们的控制类,首先来看下我们的View是什么样的
好的,那么我们的控制类应该怎么去写呢?
先看下我们的头文件:
#ifndef CALCULATORVIEW_H
#define CALCULATORVIEW_H
#include
#include "calculatormodel.h"
#include
namespace Ui {
class CalculatorView;
}
class CalculatorView : public QDialog
{
Q_OBJECT
public:
explicit CalculatorView(QWidget *parent = 0);
~CalculatorView();
private slots:
void on_btn_num_0_clicked();
void on_btn_num_1_clicked();
void on_btn_num_2_clicked();
void on_btn_num_3_clicked();
void on_btn_num_4_clicked();
void on_btn_num_5_clicked();
void on_btn_num_6_clicked();
void on_btn_num_7_clicked();
void on_btn_num_8_clicked();
void on_btn_num_9_clicked();
void on_btn_num_eq_clicked();
void on_btn_num_c_clicked();
void on_btn_num_add_clicked();
void on_btn_num_sub_clicked();
void on_btn_num_take_clicked();
void on_btn_num_div_clicked();
private:
QString temp;
Ui::CalculatorView *ui;
CalculatorModel* model;
};
#endif // CALCULATORVIEW_H
头文件一般没有多少代码,我们在这里做了几件事情
所以,重点放在了源文件
#include "calculatorview.h"
#include "ui_calculatorview.h"
/*
项目:计算器
宽:380 高:680
按钮: 80X100
间隙: 20
*/
CalculatorView::CalculatorView(QWidget *parent) : QDialog(parent),ui(new Ui::CalculatorView)
{
ui->setupUi(this);
//init
this-> temp = "";
this->model = new CalculatorModel;
}
CalculatorView::~CalculatorView()
{
delete ui;
}
//0
void CalculatorView::on_btn_num_0_clicked()
{
if(this-> temp != "")
{
this-> temp += this->ui->btn_num_0->text();
this->ui->tv_display->setText(this->temp);
}
}
//1
void CalculatorView::on_btn_num_1_clicked()
{
this-> temp += this->ui->btn_num_1->text();
this->ui->tv_display->setText(this->temp);
}
//2
void CalculatorView::on_btn_num_2_clicked()
{
this-> temp += this->ui->btn_num_2->text();
this->ui->tv_display->setText(this->temp);
}
//3
void CalculatorView::on_btn_num_3_clicked()
{
this-> temp += this->ui->btn_num_3->text();
this->ui->tv_display->setText(this->temp);
}
//4
void CalculatorView::on_btn_num_4_clicked()
{
this-> temp += this->ui->btn_num_4->text();
this->ui->tv_display->setText(this->temp);
}
//5
void CalculatorView::on_btn_num_5_clicked()
{
this-> temp += this->ui->btn_num_5->text();
this->ui->tv_display->setText(this->temp);
}
//6
void CalculatorView::on_btn_num_6_clicked()
{
this-> temp += this->ui->btn_num_6->text();
this->ui->tv_display->setText(this->temp);
}
//7
void CalculatorView::on_btn_num_7_clicked()
{
this-> temp += this->ui->btn_num_7->text();
this->ui->tv_display->setText(this->temp);
}
//8
void CalculatorView::on_btn_num_8_clicked()
{
this-> temp += this->ui->btn_num_8->text();
this->ui->tv_display->setText(this->temp);
}
//9
void CalculatorView::on_btn_num_9_clicked()
{
this-> temp += this->ui->btn_num_9->text();
this->ui->tv_display->setText(this->temp);
}
//=
void CalculatorView::on_btn_num_eq_clicked()
{
//获取num2 并且计算结果
int num = this-> temp.toInt();
this->model->setNum2(num);
QString result = this->model->doCalculator();
this->ui->tv_display->setText(result);
//uninit
this-> temp = "";
}
//c
void CalculatorView::on_btn_num_c_clicked()
{
this->ui->tv_display->setText("请输入...");
this-> temp = "";
this->model->setNum1(0);
this->model->setNum2(0);
}
//+
void CalculatorView::on_btn_num_add_clicked()
{
int num = this-> temp.toInt();
this->model->setFlag("+");
//判断如果 = 0 说明没有num1
if(num == 0)
{
//获取屏幕上的数字作为num1
QString display = this->ui->tv_display->text();
this->model->setNum1(display.toInt());
}
else
{
this->model->setNum1(num);
}
this-> temp = "";
}
//-
void CalculatorView::on_btn_num_sub_clicked()
{
int num = this-> temp.toInt();
this->model->setFlag("-");
if(num == 0)
{
//获取屏幕上的数字作为num1
QString display = this->ui->tv_display->text();
this->model->setNum1(display.toInt());
}
else
{
this->model->setNum1(num);
}
this-> temp = "";
}
//*
void CalculatorView::on_btn_num_take_clicked()
{
int num = this-> temp.toInt();
this->model->setFlag("*");
if(num == 0)
{
//获取屏幕上的数字作为num1
QString display = this->ui->tv_display->text();
this->model->setNum1(display.toInt());
}
else
{
this->model->setNum1(num);
}
this-> temp = "";
}
// /
void CalculatorView::on_btn_num_div_clicked()
{
int num = this-> temp.toInt();
this->model->setFlag("/");
if(num == 0)
{
//获取屏幕上的数字作为num1
QString display = this->ui->tv_display->text();
this->model->setNum1(display.toInt());
}
else
{
this->model->setNum1(num);
}
this-> temp = "";
}
可以看到这里的代码就有点多了,我们就需要一点点的来分析
好了,来感受一下运行的效果吧:
好的,如果你心情美美的写了一个计算器,想给朋友看一下,那么你会怎么做?
朋友打开,实际上会提示很多错误找不到各种dll文件的,我们如果没有配置qt的运行环境也是一样的,环境变量的配置我希望你自己去百度一下,很简单的
qt的安装目录下各个bin目录放入系统path变量路径下就好了,那么我们开始打包了
如果你没有配置环境变量,那么只能在Qt 5.6 for Desktop (MinGW 4.9.2 32 bit)这个gui里操作了,如果你配置了,那就可以在终端操作了
直接进入上面的build目录下执行命令:windeployqt xx.exe
然后….
这样,这个release文件夹,你就可以发给你的朋友了,里面就包含了运行所需要的dll文件。