写这篇文章,也是正赶着自己学C++,之前确实用Qt已经做过了好些工程项目,应该说对啊Qt的运行机制等都有一定的熟悉和了解,但是毕竟没有系统学过C++,直接上手的Qt,基础性的东西好多都是知道怎么用,而不知道意思。趁这次C++学习,就稍微梳理一下,顺便出一个Qt创建工程的步骤说明。
本人使用的使用的是Qt5.9,我自己之前用过10,12,不过最终还是换到了9,应该说9相对稳定,主要我确实更习惯Qt5.9。
项目创建
那废话不多说了,进入到下面的工程建立说明:
(1)进入Qt Creater 界面,点击文件,点击新建进入该界面:
选择 Application 的 Qt Widgets Application,进入到下一界面,这里就一目了三,重命名、改保存路径,再下一步。
针对上图,这里多说明几点:
(1)Qt Widgets Application 表示支持桌面平台的有图形用户界面(GUI)界面应用程序。GUI的设计完全基于C++语言,采用Qt 提供的一套C++类库。(一般的界面开发)
(2)Qt Console Application 表示控制台应用程序,无GUI界面,一般用于C/C++语言学习,只需要简单的输入输出操作就能构建此类项目。
(3)Qt Quick Application 表示创建可部署Qt Quick 2 的应用程序。(我也不熟悉,只知道这个很强大)
其他的几个,我这里就不做过多说明了,确实自己也没去深究,也不懂 ,哈哈哈哈哈。
然后进入下一界面,选择 MinGW 32bit,点击下一步。
在到这里,选择基类,我这里有要多啰嗦几句了:
(1)QMainWindow 是主窗口类,主窗口具有主菜单栏、工具栏、状态栏,类似于一般的应用程序主窗口(就行Qt Creater的主窗口上的有编辑栏那种)
(2)QWidget 是所有具有可视化界面类的基类,选择QWidget 创建的界面对各种界面组件度都可以支持(反正我最喜欢用这个,一片空白随便搞)
(3)QDialog 是对话框类,可建立一个基于对话框的界面。
第一次搞的,我觉得选QWidget类合适.
然后就是下一步,再点完成即可:
完成后导航栏会这样的结构的文件出现。
依次说明一下:
(1)untitled.pro 是项目管理文件,包括一些对项目的设置项,特别是后续开发中,需要设计添加模块的问题,就在 pro 文件中添加需要的模块;同时你打开Qt项目时也是选择这个。
(2)Header文件保存所有窗口类头文件的文件分组,widge.h
(3)Source 文件保存C++ 源码的文件分组。main.cpp是主函数文件,也是应用程序执行的入口
(4)Froms 文件分组是保存项目的所有界面文件(.ui),双击.ui文件可以进入界面编辑界面。
基础源码说明
.pro 文件
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = untitled
TEMPLATE = app
(1)QT += core gui
表示为项目添加 core gui 模块,core gui模块 是Qt用于GUI设计的类库模块。
比如需要加入包含数据库的模块,则是再其后面加入:QT += sql
(2)greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
这是一条执行语句,表示当 Qt 主版本大于4时,待加入widget模块
(3) TARGET = untitled
表示生成的目标可执行文件的名称,即编译后生成的可执行文件是untitled.exe
(4)TEMPLATE = app
表示项目使用的模板是app,即一般应用程序
main.cpp 主程序
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);//定义并创建应用程序
Widget w; //定义并创建窗口
w.show(); //显示窗口
return a.exec(); //应用程序运行
}
main函数是找整个应用程序的入口
QApplication
是Qt 的标准应用程序类
widget .h 文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui { //一个名称空间Ui,包含一个类widget
class Widget; //需要说明一下这类并不是下面的类,而是cpp文件中申明的ui_widegt.h中定义的类
}
class Widget : public QWidget //widget类的定义,所谓的继承与QWidget的类Widget的定义
{
Q_OBJECT //使用了Q_OBJECT这个宏,这是使用Qt的信号与槽(signal与slot)机制的类都必须加入的宏
public:
explicit Widget(QWidget *parent = nullptr);//widget的构造函数
~Widget();//析构函数
private:
Ui::Widget *ui;//指针,是为了使用前面声明的namespace Ui里面的Widget类定义
};
#endif // WIDGET_H
(1)Q_OBJECT
:使用了Q_OBJECT这个宏,这是使用Qt的信号与槽(signal与slot)机制的类都必须加入的宏
(2) Ui::Widget *ui
指针,是为了使用前面声明的namespace Ui里面的Widget类定义,这个很重要,在cpp中调用ui文件中的控件时,都是以ui
开头指向你需要调用的控件
(3)class Widget : public QWidget
这就说明,Widget类是QWidget类的一个派生类
widget.cpp 文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
(1)#include "ui_widget.h"
这个就是Qt编译生成的与UI文件 widget.ui 对应的类定义文件
(2) Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
构造函数头部,
意义:执行父类QWidget
的构造函数,创建一个Ui::Widget
类的对象 ui
。这个ui
就是Widget 的private
中定义的指针变量 ui
。(采用C++中的成员初始化列表语句)
(3)ui->setupUi(this)
执行Ui::Widget
类的setupUi函数,这个函数实现窗口的生成与各种属性的设置、信号与槽的关联,this指针指向定义的widget类
(4)析构函数就是删除用 new 创建的ui指针
注意:(我自己学C++不精,所以以作提醒)
冒号后面跟的是赋值,这种写法是C++的特性。
A( int aa, int bb ):a(aa),b(bb)
{
}
相当于
A( int aa, int bb )
{
a=aa;
b=bb;
}
后续开始 Qt 的系统学习,整合深化自己本科阶段所掌握的Qt知识。