QT基础:Qt入门

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

#include

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

相关推荐

如何在GitHub上添加其他用户:全面指南
必发365娱乐在线官网

如何在GitHub上添加其他用户:全面指南

📅 09-18 👁️ 6105
ipad屏幕碎了怎么办?ipad换屏幕攻略(图文+视频)
必发365娱乐在线官网

ipad屏幕碎了怎么办?ipad换屏幕攻略(图文+视频)

📅 09-13 👁️ 2809
14个值得购买的鞋类美国海淘网站推荐
365娱乐app官方版下载

14个值得购买的鞋类美国海淘网站推荐

📅 08-16 👁️ 5038