QT基础:Qt入门
1. Qt概述
1.1 什么是Qt
- 是一个跨平台的C++应用程序开发框架
- 具有短平快的优秀特质: 投资少、周期短、见效快、效益高
- 几乎支持所有的平台, 可用于桌面程序开发以及嵌入式开发
- 有属于自己的事件处理机制
- 可以搞效率的开发基于窗口的应用程序。
- Qt是标准 C++ 的扩展, C++的语法在Qt中都是支持的
- 良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,可以快速上手。
- Qt 提供了一种称为
signals/slots的安全类型来替代callback(回调函数),这使得各个元件之间的协同工作变得十分简单。
Qt的特点
-广泛用于开发GUI程序,也可用于开发非GUI程序。
- GUI = Graphical User Interface
- 也就是基于窗口的应用程序开发。
- 有丰富的 API
- Qt 包括多达 250 个以上的 C++ 类
- 可以处理正则表达式。
- 支持 2D/3D 图形渲染,支持 OpenGL
- Qt给程序猿提供了非常详细的官方文档
- 支持XML,Json
- 框架底层模块化, 使用者可以根据需求选择相应的模块来使用
- 可以轻松跨平台
- 和Java的跨平台方式不同
- 在不同的平台使用的是相同的上层接口,但是在底层封装了不同平台对应的API(暗度陈仓)。
1.2 Qt中的模块
| 模块 | 描述 |
|---|---|
Qt Core |
Qt 类库的核心,所有其他模块都依赖于此模块 |
Qt GUI |
设计 GUI 界面的基础类,包括 OpenGL |
| Qt Multimedia | 音频、视频、摄像头和广播功能的类 |
| Qt Multimedia Widgets | 实现多媒体功能的界面组件类 |
| Qt Network | 使网络编程更简单和轻便的类 |
| Qt QML | 用于 QML 和 JavaScript语言的类 |
| Qt Quick | 用于构建具有定制用户界面的动态应用程序的声明框架 |
| Qt Quick Controls | 创建桌面样式用户界面,基于 Qt Quick 的用户界面控件 |
| Qt Quick Dialogs | 用于 Qt Quick 的系统对话框类型 |
| Qt Quick Layouts | 用于 Qt Quick 2 界面元素的布局项 |
| Qt SQL | 使用 SQL 用于数据库操作的类 |
| Qt Test | 用于应用程序和库进行单元测试的类 |
Qt Widgets |
用于构建 GUI 界面的 C++ 图形组件类 |
1.3 Qt案例
Qt发展至今已经是一个非常成熟的框架,基于这个框架许多公司开发出了很多优秀的软件,下边给大家介绍几款我们常见到的软件:
VirtualBox:虚拟机软件。VLC多媒体播放器:一个体积小巧、功能强大的开源媒体播放器。YY语音:又名“歪歪语音”,是一个可以进行在线多人语音聊天和语音会议的免费软件。咪咕音乐:咪咕音乐是中国移动倾力打造的正版音乐播放器WPS Office:金山公司(Kingsoft)出品的办公软件,与微软Office兼容性良好,个人版免费。Skype:一个使用人数众多的基于P2P的VOIP聊天软件。
2. 安装
2.1 安装包下载
基于Window平台 Qt 5.14.2的安装和相关配置。
Qt官方下载地址:https://download.qt.io/archive/qt/
具体可以参考:https://subingwen.cn/qt/qt-primer/
2.2 环境变量设置
环境变量
C:\Qt\Qt5.12.8\Tools\QtCreator\bin
C:\Qt\Qt5.12.8\Tools\mingw730_64\bin
C:\Qt\Qt5.12.8\5.12.8\mingw73_64\bin
编译步骤
通过Qt 5.12.8 (MinGW 7.3.0 64-bit)进入命令行,cd命令进入到项目目录下:
qmake -project // 生成pro项目文件,打开添加: QT += widgets
qmake // 生成Makefile文件
mingw32-make // 生成可执行文件,在release目录下
3. Qt窗口类
常用的窗口类有3个,分别为: QMainWindow、QDialog、QWidget。在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的其中一个
QWidget- 所有窗口类的基类
- Qt中的控件(按钮, 输入框, 单选框…)也属于窗口, 基类都是
QWidget - 可以内嵌到其他窗口中: 没有边框
- 可以不内嵌单独显示: 独立的窗口, 有边框
QDialog- 对话框类, 后边的章节会具体介绍这个窗口
- 不能内嵌到其他窗口中
QMainWindow- 有工具栏, 状态栏, 菜单栏, 后边的章节会具体介绍这个窗口
- 不能内嵌到其他窗口中

3.1 非模态窗口显示
QWidget是所有窗口类的基类, 调用它提供的show() 方法就可以显示窗口,这个方法会立即返回,不会阻塞当前线程,允许程序继续执行其他任务
非模态显示是指对话框在显示时不会阻止用户与其他窗口进行交互。与模态对话框不同,非模态对话框允许用户在对话框和其他窗口之间自由切换。
非模态对话框通常是通过窗口管理器来管理的,它们可以被移动到屏幕上的任何位置,并且可以被最小化、最大化或关闭。
void QWidget::show(); // 对话框窗口的非模态显示
3.2 模态窗口显示
模态对话框会阻止用户与其他窗口进行交互,直到该对话框被关闭。
在对话框被关闭之后,exec()方法会返回一个整数值,这个值通常是QDialog::Accepted或QDialog::Rejected,表示对话框的关闭方式(例如,用户点击了“确定”或“取消”按钮)。
// 对话框窗口的非模态显示: 还是调用show() 方法
// 对话框窗口的模态显示
[virtual slot] int QDialog::exec();
#include <QApplication>
#include <QDialog>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget parent;
parent.show();
QDialog child;
child.resize(100,100);
child.exec(); // 显示模态对话框 此时只能在child的窗口中操作
return app.exec();
}
4. 内存回收机制:对象树
在Qt中创建对象的时候会提供一个 Parent对象指针(可在类的构造函数中查看)
QObject是以对象树的形式组织起来的。当创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。
创建的这个QObject对象会自动添加到其父对象的children()列表。当父对象析构的时候,这个列表中的所有对象也会被析构。
例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件。
Qt 引入对象树的概念,在一定程度上解决了内存回收问题
- 当一个
QObject对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。 - 任何对象树中的
QObject对象被delete时:- 如果该对象指定了
parent,则自动将其从parent的children()列表中删除; - 如果
children()列表不为空,则自动delete其中的子对象 - Qt通过对象树机制和
deleteLater()方法保证了QObject及其派生类实例不会被删除两次,这是由对象的析构顺序和Qt的内存管理规则共同决定的。
- 如果该对象指定了
4.1 指定父对象的两个方法
1、通过构造函数指定
parent
创建对象时,指定parent即可
// parent: 当前窗口的父对象, 找构造函数中的 parent 参数即可
QWidget::QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
QTimer::QTimer(QObject *parent = nullptr);
2、通过
setParent()方法指定parent
若控件在构造时未指定符对象, 可以调用setParent指定父窗口对象
void QWidget::setParent(QWidget *parent);
void QObject::setParent(QObject *parent);
5. 日志输出:QDebug
5.2 调试窗口日志输出
Qt框架提供了专门用于日志输出的类, 头文件名为 QDebug, 使用方法如下:
// 包含了QDebug头文件, 直接通过全局函数 qDebug() 就可以进行日志输出了
qDebug() << "Date:" << QDate::currentDate();
qDebug() << "Types:" << QString("String") << QChar('x') << QRect(0, 10, 50, 40);
qDebug() << "Custom coordinate type:" << coordinate;
和全局函数qDebug()类似的日志函数还有:qWarning(),qInfo(),qCritical()
int number = 666;
float i = 11.11;
qWarning() << "Number:" << number << "Other value:" << i;
qInfo() << "Number:" << number << "Other value:" << i;
qCritical() << "Number:" << number << "Other value:" << i;
5.3 终端窗口输出日志
默认情况下日志信息只会在QT控制台显示,不会打印到终端窗口,
如果想要实现这样的效果, 必须在项目文件中添加相关的属性信息。
打开项目文件(*.pro)找到配置项config, 添加 console 控制台属性:
CONFIG += c++11 console
6. 程序发布
cmd进入目标目录下
md windeploy
cd windeploy
将release下生成的.exe拷贝到windeploy目录下,执行:
windeployqt xxx.exe

浙公网安备 33010602011771号