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个,分别为: QMainWindowQDialogQWidget。在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的其中一个

  • QWidget
    • 所有窗口类的基类
    • Qt中的控件(按钮, 输入框, 单选框…)也属于窗口, 基类都是QWidget
    • 可以内嵌到其他窗口中: 没有边框
    • 可以不内嵌单独显示: 独立的窗口, 有边框
  • QDialog
    • 对话框类, 后边的章节会具体介绍这个窗口
    • 不能内嵌到其他窗口中
  • QMainWindow
    • 有工具栏, 状态栏, 菜单栏, 后边的章节会具体介绍这个窗口
    • 不能内嵌到其他窗口中

3.1 非模态窗口显示

QWidget是所有窗口类的基类, 调用它提供的show() 方法就可以显示窗口,这个方法会立即返回,不会阻塞当前线程,允许程序继续执行其他任务

非模态显示是指对话框在显示时不会阻止用户与其他窗口进行交互。与模态对话框不同,非模态对话框允许用户在对话框和其他窗口之间自由切换。

非模态对话框通常是通过窗口管理器来管理的,它们可以被移动到屏幕上的任何位置,并且可以被最小化、最大化或关闭。

void QWidget::show();	// 对话框窗口的非模态显示

3.2 模态窗口显示

模态对话框会阻止用户与其他窗口进行交互,直到该对话框被关闭。

在对话框被关闭之后,exec()方法会返回一个整数值,这个值通常是QDialog::AcceptedQDialog::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,则自动将其从parentchildren()列表中删除;
    • 如果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
posted @ 2024-12-21 15:37  -O-n-e-  阅读(3543)  评论(0)    收藏  举报