Featured image of post QT学习记录_02

QT学习记录_02

Qt Study Record Day2

Qt项目构建及项目结构说明

Qt Creator窗口介绍

  • 欢迎界面
    • Projects:主要功能为管理会话、创建项目、打开项目
    • 示例:可下载并参考一些官方做的Qt项目
    • 教程:官方的Qt教程,需要翻墙观看
    • MarketPlace:一些可下载的Qt工具包
  • 编辑界面:编辑当前项目代码
  • 设计界面:通过可视化操作编辑当前界面UI
  • Debug界面:代码调试
  • 项目界面:设置并查看当前项目的一些配置信息
  • 帮助界面:极为重要的界面,可以使用Filter学习自己不熟悉的类

Qt项目构建流程

  1. 欢迎界面的Projects模块点击New新建项目 Picture
  2. 在本次学习中,我们只涉及到Qt窗口应用的构建及开发,选择Application(Qt)->Qt Widgets Application点击Choose Picture
  3. 选择要创建项目的存储路径并输入项目名称,该步骤完成后会在存储路径生成两个目录,一个用于存放源文件,另一个用于存放构建及调试文件。(后续会讲解如何将这两个目录合并到一起) Picture
  4. 选择项目的构建系统,在该步骤中,Qbs一般不会考虑,剩余两项构建系统的区别为:
    qmake:是Qt内置的构建系统,十分地简单方便,但扩展性和功能相对较低,初学阶段或小型项目选择qmake点击下一步即可。
    cmake:相对复杂,但扩展性和功能更加强大,适用于复杂度超过qmake处理能力的项目。 Picture
  5. 设置自己的窗口类,并勾选是否使用设计界面编辑窗口,其中类名可以自由指定,QWidgetQMainWindowQDialog的父类。 Picture QWidget是最简单的交互窗口,QMainWindow除了窗口外多了菜单栏、状态栏等等,QDialog是对话框(包含确认按钮、取消按钮等,类比当前窗口Picture 选中Generate form后会启用设计界面。指定类名后,下面的基类名、头文件、源文件等会自动跟随自定义类名进行命名。配置完成后点击下一步。 Picture
  6. 选择是否为Qt项目添加英文自动翻译工具,一般不需要因此暂时忽略。 Picture
  7. 选择构建项目所使用的编译环境,我是64位机因此选择第二个选项,如要获得更多的系统可移植性可选择32位进行项目构建。 Picture
  8. 完成项目构建,从要添加的文件中可了解到项目的构建路径以及项目所包含的项目文件。
    main.cpp是主程序入口
    mywidget.cpp是个人定制的窗口类
    mywidget.h是个人定制的窗口类的头文件
    mywidget.ui是个人定制的窗口类的可视化设计文件,它本质上是一个标准XML格式的文本,需要通过uic工具将其转换为项目中可用的ui_*.h头文件,使用时ui是一个指向自定义界面类的指针(后面一般跟着控件名)例如ui文件中有一个叫textEditQTextEdit组件,你就可以通过ui->textEdit来访问这个文本框
    QtStudy_Day01.pro是工程文件,是qmake(or cmake)自动生成的用于生成makefile的配置文件,可以通过该文件直接打开项目。
    Picture

基础main函数详解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 自己新建的窗口类
#include "mywidget.h"
// 包含一个应用程序类的头文件
#include <QApplication>
// main函数主要执行一些初始化的工作,然后将控制权转交给Qt库,然后Qt库通过事件向程序告知用户行为。
// 程序入口,argc用来接收命令行参数的个数,argv用来接收命令行参数的数组
int main(int argc, char *argv[])
{
    // a是应用程序类QApplication实例化出来的对象,每个Qt程序有且仅有一个
    QApplication a(argc, argv);
    // 使用自定义的窗口类MyWidget构建一个窗口对象w,MyWidget是继承自父类QWidget的子类
    MyWidget w;
    // 构建窗口对象w后默认不会显示窗口,必须调用show方法进行显示
    w.show();
    // 让应用程序对象进入消息循环,即main函数将控制权转交给Qt
    // 在exec()函数中,Qt接收处理用户和系统的事件并将它们传递给适当的窗口部件
    return a.exec();
    /*
        类比:
        while(true){
            if(点击叉号)
                break;
            else{
                捕获动作
                continue;
            }
        }
    */
}

.pro文件详解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 一般情况下不要轻易改动.pro文件
# Qt包含的模块:core和gui(Qt5以上才将Qt Widget模块从gui模块分离出来)
QT       += core gui
# Qt版本号大于4,Qt新增了Widget模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 工程配置和编译的参数,允许C++11语法
CONFIG += c++11
# 项目编译后生成的可执行文件的文件名(可修改),在项目调试目录中
TARGET = QtStudy_Day01
# 使用Qt的application模板,告诉qmake为这个应用程序生成哪种makefile
TEMPLATE = app
# 预定义预处理符号
DEFINES += QT_DEPRECATED_WARNINGS
# 指定来自moc的所有中间文件放置的目录(含Q_OBJECT宏的头文件转换为标准.h文件的存放目录)
MOC_DIR += \
# 指定多有中间文件.o(.obj)放置的目录
OBJECTS_DIR += \
# UIC将ui转化为头文件所存放的目录
UI_DIR += \
# 指定编译项目时应该搜索的文件夹
INCLUDEPATH += \
# 指定最终文件生成的目录
DESTDIR += \


# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

# 源文件包含main.cpp以及mywidget.cpp文件
SOURCES += \
    main.cpp \
    mywidget.cpp
# 头文件包含mywidget.h文件
HEADERS += \
    mywidget.h
# 设计文件包含mywidget.ui文件
FORMS += \
    mywidget.ui

# Default rules for deployment.
# 目标文件地址
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

自定义窗口头文件详解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 防止头文件被重复引用,如果没有该自定义头文件则执行#define MYWIDGET_H进行头文件包含操作。
#ifndef MYWIDGET_H  
#define MYWIDGET_H
// 包含窗口类头文件
#include <QWidget>

// 定义自定义窗口类的命名空间Ui,声明Ui命名空间下的Widget类
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE

// 让自定义窗口类继承QWidget类以使用show等方法
class MyWidget : public QWidget
{
    // 宏,允许类中使用信号和槽的机制以及元对象系统服务,必须限定为私有访问权限
    Q_OBJECT

public:
    // 声明有参构造函数并提供默认值,使用该默认值时将调用父类QWidget的有参构造函数
    MyWidget(QWidget *parent = nullptr);
    // 声明默认析构函数
    ~MyWidget();

private:
    // 创建Ui::Widget类型的指针,用于操作ui界面及其控件。
    Ui::MyWidget *ui;
};
#endif // MYWIDGET_H

自定义窗口源文件详解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include "mywidget.h"
#include "ui_mywidget.h"
// 有参构造函数的定义:声明时使用了默认参数,定义时则不再使用
/*
 * MyWidget有参构造函数的定义,并使用初始化列表对其进行初始化:
 * 已知MyWidget继承自QWidget,令QWidget *parent = parent,然后对MyWidget进行初始化。
 * 令ui = new Ui::MyWidget,使得ui指针指向新创建的Ui命名空间内的MyWidget类型对象,通过这个对象可以访问和操作MyWidget的用户界面元素。
*/
MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{
    // 为ui对象传入当前窗口对象指针,将当前窗口对象与其ui绑定
    ui->setupUi(this);
}
// 析构函数的定义
MyWidget::~MyWidget()
{
    delete ui;
}

Qt Creator快捷键

Key 说明
ctrl + / 注释
ctrl + r 运行
ctrl + b 编译
ctrl + MouseUp/MouseDown 字体缩放
ctrl + f 查找
ctrl + shift + ↑/↓ 整行移动
F1 帮助文档(或者直接运行Qt Assistant)
ctrl + i 自动对齐
F4 同名之间 .h和 .cpp自由切换
Licensed under CC BY-NC-SA 4.0
热爱可抵岁月漫长,温柔可挡艰难时光。
Nothing but enthusiasm brightens up the endless years.
转载请注明主页网址哦~