QT的第一个程序:计算器

0、引言

常言说得好,学好C++,走遍天下都不怕。在学习C++的过程中,不得不说,面向对象和面向过程的思想确实有些不同,本文根据吴健老师的QT教程所写,属于学习笔记,仅为备忘及心得,如有错误,还望指出,感谢。
工程文件点这里

1、MVC模式

百度上有较为详尽的资料,再次不做赘述,仅为本文做学习笔记所用

Model:数据处理
文件名:model.cpp / model.h
说明:用于计算器的计算部分(由Controller传入\出数据)

View:界面/交互
文件名:mainwindow.ui
说明:该部分主要是使用QT设计师创建(各个控件的属性重要)

Controller:控制/功能
文件名:mainwindow.cpp / mainwindow.h
说明:该部分作为连接model和View两个部分

2、交互界面备忘

QT的第一个程序:计算器_第1张图片
上图1为本文计算器所采用的交互界面

2.1、label控件
保持右对齐:Qlabel属性中,选中alignment->horizontal->alignright
背景颜色与字体:QWidget属性中,选中stylesheet->add color下拉->background-color
确认objectName

2.2、按钮
确定ObjectName和Qabstractbutton中的text文本(此处属性关系Controller部分的调用)
直接采用go to slot的方法连接信号槽,这里需要注意选定事件(如按键按下),函数名称会是你的ObjectName。

3、代码

3.1、手写信号槽
备注:

this指针只能用在类的内部,通过 this 可以访问类的所有成员,包括 private、protected、public 属性的。

参考:C++ this指针详解(精辟)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //连接ui的pushbotton_0,触发信号为按键被按下(bool),对应槽函数为getBtn0;
    connect(this->ui->pushButton_0, SIGNAL(clicked(bool)),this,SLOT(getBtn0()) );
        this->tmp = "";//初始化中间变量
       this->mode=new model;//理解不足,留坑(mode为model类的指针,目的应该是为了调用modele类内部成员)
}
void MainWindow::getBtn0()
{
//    qDebug()<<"Test";//打印测试,需要调用qdebug.h头文件,类似Cout
//该按键为“0”,所以需要先判断tmp是否为空(0不能再首位)
    if(this->tmp!=""){
    //暂存字符串,获取按钮的文本属性
  this->tmp+=  this->ui->pushButton_0->text();
    //填入label的Text窗口,并显示相应数据
    this->ui->label->setText(this->tmp);
    }
}

3.2、go to slot信号槽
在按钮部分右键go to slot 选项
QT的第一个程序:计算器_第2张图片
此处留坑,对应的事件及连接多个槽后续另开博文表述,当前理解不足

void MainWindow::on_pushButton_3_clicked()
{
//tmp获取按键3属性中的文本
    this->tmp+=  this->ui->pushButton_3->text();
   //label在ui中,所以是如下结构,在label中显示
   this->ui->label->setText(this->tmp);
}

3.3、运算符处理
依然使用go to slot,以下为“+”号

//该函数在model.cpp文件内
void model::setNum1(int num)
{
    this->num1 = num;
}

void model::setFlag(QString flag)
{
    this->flag = flag;
}

//该函数在MainWindow.cpp文件内
void MainWindow::on_pushButton_10_clicked()
{
    //先将之前输入的字符串转换为整数
     int num=this->tmp.toInt();
     //存入model成员num1中
     this->mode->setNum1(num);
     //情况中间函数,等待输入下一个数据
     this->tmp="";
     //获取按钮对应符号
     QString ex=this->ui->pushButton_10->text();
     //将运算符存入model的成员flag中
     this->mode->setFlag(ex);
}

//等于符号
void MainWindow::on_pushButton_14_clicked()
{	
	//将第二次输入数据转换为整型,并传入Num2中
    int num=this->tmp.toInt();
    this->mode->setNum2(num);
	//执行doEXpr函数,res获取返回值,并将结果在label中显示
    QString res=this->mode->doExpr();
    this->ui->label->setText(res);
    this->tmp="";
}

//Clean
void MainWindow::on_pushButton_15_clicked()
{
     this->tmp = "";
    this->ui->label->setText("0");
}

以下为计算函数,主要是先判断运算符,后计算并返回数据

//该函数在model.cpp文件内
QString model::doExpr()
{
    int result=0;
    if(this->flag=="+")result=num1+num2;
    if(this->flag=="-")result=this->num1-this->num2;
    if(this->flag=="*") result=this->num1*this->num2;
    if(this->flag=="/") result=this->num1/this->num2;
    else{
        if(flag!="+"&&flag!="-"&&flag!="*"&&flag!="/")return  QString::number( this ->num1);
    }
     return QString::number(result);
}

以下代码为model.h全部内容

//新建一个model类,用于计算
class model
{
    //定义为公有
public:
    model();//构造函数
    //获取数据函数(数据位私有,外部无法直接访问)
    void setNum1(int num);
    void setNum2(int num);
    //设置符号
    void setFlag(QString flag);
    //计算
        QString doExpr();

//定义为私有
private:
    //用于计算的2个数字num1,num2,运算符为字符串类型
    int num1;
    int num2;
    QString flag;

};

4、打包exe

先将编译方式设置为release(发布),并编译
QT的第一个程序:计算器_第3张图片
后找到并打开项目的生成路径
QT的第一个程序:计算器_第4张图片
在这个目录下找到可执行的exe文件(此时无法点击运行)
将exe后缀的文件复制到另一个新的文件夹中,用于发布
如E:\Demo
在开始菜单中找到命令行窗口并打开它
QT的第一个程序:计算器_第5张图片
在命令行中输入exe文件路径

cd /d E:\Demo

在弹出对应路径后,使用 windeployqt 工具命令,并执行:

windeployqt hellomw.exe

执行
最后把Demo文件夹打包即可完成发布

5、参考资料

QT生成可执行的EXE程序:https://www.cnblogs.com/baby0814/p/8568727.html
吴健老师QT相关视频教程
QT快捷键及命名规范:https://www.cnblogs.com/xiangtingshen/p/10742698.html
详细,Qt Creator快捷键大全,附快捷键配置方法:https://blog.csdn.net/desert187/article/details/23996821

6、常用快捷键

ctrl+tab——》切换已打开的文档

你可能感兴趣的:(QT)