QT开发(三)—— 项目实战:计算器,打包发布软件

这次我们来做一个小案例,这个案例算是比较有特色的就是计算器了,我们采用MVC的方式来实现

效果还是比较满意的

实际上算了一下 大小然后再UI中可以设置指定的大小,就不会变形了,因为我们这个也不是主Window,而是一个Dialog

我们先来说下我们使用的MVC架构,实际上,我们默认的UI文件,他就是View,也就是我们所说的界面,那么默认创建的UI源文件,就是C了也就是控制类,而M呢,就需要我们自己去实现以下了,也就是Model类,实现一些基本的计算方法

而我们的View这一块布局,大家就自己去写就好了,因为可以拖动的,当然,我也会上传源码供大家下载,我们主要来看下我们的开发流程

我们这里首先考虑的是控件,因为我们只是一个小窗口,所以这里我选择了QDialog

这里写图片描述

然后我们创建一个CalculatorModel的C++类来处理逻辑

#ifndef CALCULATORMODEL_H
#define CALCULATORMODEL_H
#include <QString>

//公开的运算的方法: 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并且判断了运算方法来获取结果,这里考虑了几个逻辑

  • 1.除数不能为0
  • 2.不点击运算 直接点击= 返回 num1

这里用到了int转string,使用的是QString的静态函数number

好,这是model类,回过头来看我们的控制类,首先来看下我们的View是什么样的

这里写图片描述

好的,那么我们的控制类应该怎么去写呢?

先看下我们的头文件:

#ifndef CALCULATORVIEW_H
#define CALCULATORVIEW_H

#include <QDialog>
#include "calculatormodel.h"
#include <QString>

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

头文件一般没有多少代码,我们在这里做了几件事情

  • 1.定义了很多的槽函数
  • 2.定义了temp的中间变量
  • 3.定义了model类

所以,重点放在了源文件

#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 = "";
}

可以看到这里的代码就有点多了,我们就需要一点点的来分析

  • 1.构造函数中初始化了temp以及model类
  • 2.数字键点击后除了0按键其他都是获取到当前按钮的数字然后设置在文本显示器上
  • 3.0按键需要先判断是否为空,不然会造成000000这种奇葩现象
  • 4.清除按钮只是把文本显示器清空并且一切数据重置
  • 5.运算按钮考虑的东西有点多
    • a.先获取temp这个中间变量
    • b.再设置一下运算符号
    • c.判断temp是否=0
      • 如果等于0,说明没有按数字键就点击了运算符号,这里此时有两种清空
        • 1.直接按+,然后再按数字,再按等号,这样实际上是 0 运算符 数字 = 得到正确结果
        • 2.运算完上一个结果直接运用
    • d.使用完temp后重置作为num2使用
    • e.这里使用了string转int使用的是toint函数
      -6.等于会获取当前的数字作为num2并且计算后显示出来,重置中间变量

好了,来感受一下运行的效果吧:

这里写图片描述

好的,如果你心情美美的写了一个计算器,想给朋友看一下,那么你会怎么做?

  • 1.运行release版本(左下角可选debug & release)
  • 2.打开对应的build文件:build-QtCalculator-Desktop_Qt_5_6_1_MinGW_32bit-Release\release\xx.exe
  • 3.发送给朋友

朋友打开,实际上会提示很多错误找不到各种dll文件的,我们如果没有配置qt的运行环境也是一样的,环境变量的配置我希望你自己去百度一下,很简单的

qt的安装目录下各个bin目录放入系统path变量路径下就好了,那么我们开始打包了

如果你没有配置环境变量,那么只能在Qt 5.6 for Desktop (MinGW 4.9.2 32 bit)这个gui里操作了,如果你配置了,那就可以在终端操作了

直接进入上面的build目录下执行命令:windeployqt xx.exe

然后….

这里写图片描述

这样,这个release文件夹,你就可以发给你的朋友了,里面就包含了运行所需要的dll文件。

源码下载:点击下载

猜你喜欢

转载自blog.csdn.net/qq_26787115/article/details/79886684