常言说得好,学好C++,走遍天下都不怕。在学习C++的过程中,不得不说,面向对象和面向过程的思想确实有些不同,本文根据吴健老师的QT教程所写,属于学习笔记,仅为备忘及心得,如有错误,还望指出,感谢。
工程文件点这里
百度上有较为详尽的资料,再次不做赘述,仅为本文做学习笔记所用
Model:数据处理
文件名:model.cpp / model.h
说明:用于计算器的计算部分(由Controller传入\出数据)
View:界面/交互
文件名:mainwindow.ui
说明:该部分主要是使用QT设计师创建(各个控件的属性重要)
Controller:控制/功能
文件名:mainwindow.cpp / mainwindow.h
说明:该部分作为连接model和View两个部分
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.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 选项
此处留坑,对应的事件及连接多个槽后续另开博文表述,当前理解不足
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;
};
先将编译方式设置为release(发布),并编译
后找到并打开项目的生成路径
在这个目录下找到可执行的exe文件(此时无法点击运行)
将exe后缀的文件复制到另一个新的文件夹中,用于发布
如E:\Demo
在开始菜单中找到命令行窗口并打开它
在命令行中输入exe文件路径
cd /d E:\Demo
在弹出对应路径后,使用 windeployqt 工具命令,并执行:
windeployqt hellomw.exe
执行
最后把Demo文件夹打包即可完成发布
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
ctrl+tab——》切换已打开的文档