第12章 Qt项目实战之计算器


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

第12章 Qt项目实战之计算器

image.png

12.1 简介

计算器的样子模仿Windows自带的计算器,但是简化了一些。

好文章,来自【福优学苑@音视频+流媒体】

一整体方案设计

本设计总体可分为两个部分,界面设计部分内部逻辑部分

界面设计入上图所示一些按钮和一个QLineEdit(用于输入数字和显示结果)和QLabel(用于显示运算表达式)。

  

主要是采用界面设计师(直接拖拽设计)代码设计部分

基本上外部的垂直布局里面套了个网格布局(网格布局里主要是处于下方的按钮)



12.2 MVC框架

MVC(Model-View-Controller)框架

其实从字面意思来说,只能了解各大概,view应该是视图的意思,那Model和Controller究竟是什么?  

image.png

  • Model: 处理数据逻辑和程序运行状态,实体类,用于存储属性值

  • View:  则只负责显示

  • Controller: 通常负责处理用户交互的部分,从视图读取数据与用户输入,并向模型发送数据;这里顺便提一下,在Qt里面我们并没有Controller的概念,而是Delegate(委托),意义很明显:控制器委托模型来处理数据,模型委托控制器来做数据的交互。


这样的框架好处是很明显的:

  • - 高重用性:一个模型可以有多个视图,同样一个视图也可以对应多个模型

  • - 低耦合:因为模型与视图分离,所以可以独立的拓展和修改而不产生相互的影响

  • - 快速开发和便捷部署

好文章,来自【福优学苑@音视频+流媒体】



12.3 创建工程

打开Qt Creator

点击New Project 创建工程

 选择Qt Widgets Application,点击Choose,

按照提示,填写名称和路径,然后下一步。

选择基类是QWidget,类名为Widget.(或者自己取名)

然后下一步。

然后点完成。

程序创建好了。  


12.4 界面设计(View)

双击后缀为.ui的文件,进入设计界面。

我们在这里进行布局。

好文章,来自【福优学苑@音视频+流媒体】

模仿windows系统自带计算器,我们设计的计算器的界面为:

image.png


设计界面的操作比较简单:上面是一个LineEdit和一个Label,用于显示,

下面是4x4的按钮区(Push Button)。 

设置好界面后,为了方便后面的操作,我们要修改它们的名字。

例如按钮C:功能是清除,名字就改成btn_clear.


 image.png

好文章,来自【福优学苑@音视频+流媒体】

12.5 模型代码(Model)

右击我们的项目,选择添加新文件,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);

    //计算

    QString doExpr();

private:

    //用于计算的2个数字num1,num2,符号flag

    int num1;

    int num2;

    QString flag;


};

#endif // MODEL_H

  

好文章,来自【福优学苑@音视频+流媒体】

model.cpp代码如下:


void model::setNum1(int num)

{

    num1 = num;

}

void model::setNum2(int num)

{

    num2 = num;

}


void model::setFlag(QString flag)

{

    this->flag = flag;

}


QString 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 QString::number(result);


}


  

好文章,来自【福优学苑@音视频+流媒体】

12.6 控制器(Controller)

将模型和界面(在窗口初始化时,即构造函数中)连接起来。 

方式: 信号槽 

直接在界面设计的地方点击按钮--转到槽,写槽函数。


private slots:

    void on_pushButton_clear_clicked();

    void on_pushButton_000_clicked();

    void on_pushButton_001_clicked();

    void on_pushButton_002_clicked();

    void on_pushButton_003_clicked();

    void on_pushButton_004_clicked();

    void on_pushButton_005_clicked();

    void on_pushButton_006_clicked();

    void on_pushButton_007_clicked();

    void on_pushButton_008_clicked();

    void on_pushButton_009_clicked();

    void on_pushButton_add_clicked();

    void on_pushButton_equal_clicked();

    void on_pushButton_sub_clicked();

    void on_pushButton_mul_clicked();

    void on_pushButton_div_clicked();


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***