当前位置: 首页 > news >正文

Qt开发及建立工程

Qt开发

​ 内容摘要:文章主要是为初学者介绍 Qt 框架的一些基本特性,主要内容包括: Qt的特点 , Qt中的模块划分 , Qt的安装 , Qt项目文件介绍 , Qt中的窗口类 , Qt窗口的坐标体系 , Qt框架的内存回收机制。 文章中除了关于知识点的文字描述,还有相关的视频讲解 。

1、Qt概述

​ 不论我们学习什么样的知识点首先第一步都需要搞明白它是什么,这样才能明确当前学习的方向是否正确,下面给大家介绍一下什么是 Qt。

1.1 什么是 Qt

不论我们学习什么样的知识点首先第一步都需要搞明白它是什么,这样才能明确当前学习的方向是否正确,下面给大家介绍一下什么是 Qt。

1、Qt是一个跨平台的 C++ 应用程序开发框架

  • ​ 具有短平快的优秀特质:投资少、周期短、见效快、效益高

  • ​ 几乎支持所有的平台,可用于桌面程序开发以及嵌入式开发

  • ​ 有属于自己的事件处理机制

  • ​ 可以搞效率的开发基于窗口的应用程序。

2、Qt 是标准 C++ 的扩展,C++ 的语法在 Qt 中都是支持的

  • 良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,可以快速上手。
  • Qt 提供了一种称为 signals/slots 的安全类型来替代 callback(回调函数),这使得各个元件 之间的协同工作变得十分简单。

1.2 Qt的特点

知道了 Qt 是什么之后,给大家介绍一下 Qt 这个框架的一些优点,就是因为具有了这些优秀的特质才使得现在很多企业都首选 Qt 进行基于窗口的应用程序开发,并且近年来市场对 Qt 程序猿的需求也在不断攀升。

  • 广泛用于开发 GUI 程序,也可用于开发非 GUI 程序。
    • GUI = Graphical User Interface(GUI = 图形用户界面)
    • 也就是基于窗口的应用程序开发。
  • 有丰富的 API
    • Qt 包括多达 250 个以上的 C++ 类
    • 可以处理正则表达式。
  • 支持 2D/3D 图形渲染,支持 OpenGL
  • Qt 给程序猿提供了非常详细的官方文档
  • 支持 XML,Json
  • 框架底层模块化, 使用者可以根据需求选择相应的模块来使用
  • 可以轻松跨平台
    • 和 Java 的跨平台方式不同
    • 在不同的平台使用的是相同的上层接口,但是在底层封装了不同平台对应的 API(暗度陈仓)。

框架底层模块化,使用者可以根据需求选择合适的模块来使用

1.2.1 附加说明

  1. Qt Core、 Qt GUI 、 Qt Widgets自动加载到项目中
  2. Qt SQL 用于数据库操作的类
  3. Qt Test 用于应用程序和库进行单元测试的类

在这里插入图片描述

1.3 Qt 中的模块

Qt 类库里大量的类根据功能分为各种模块,这些模块又分为以下几大类:

  • Qt 基本模块(Qt Essentials):提供了 Qt 在所有平台上的基本功能。
  • Qt 附加模块(Qt Add-Ons):实现一些特定功能的提供附加价值的模块。
  • 增值模块(Value-AddModules):单独发布的提供额外价值的模块或工具。
  • 技术预览模块(Technology Preview Modules):一些处于开发阶段,但是可以作为技术预览使用的模块。
  • Qt 工具(Qt Tools):帮助应用程序开发的一些工具。

在这里插入图片描述

Qt基本模块重点模块(Qt Essentials)

  • Qt Core
  • Qt GUI
  • Qt Widgets

Qt 官网或者帮助文档的 “All Modules” 页面可以查看所有这些模块的信息。以下是官方对 Qt 基本模块的描述。关于其他模块感兴趣的话可以自行查阅。
于其他模块感兴趣的话可以自行查阅。

1.4 Qt案例

Qt 发展至今已经是一个非常成熟的框架,基于这个框架许多公司开发出了很多优秀的软件,下边给大家介绍几款我们常见到的软件:

  • VirtualBox:虚拟机软件。
  • VLC多媒体播放器:一个体积小巧、功能强大的开源媒体播放器。
  • YY语音:又名 “歪歪语音”,是一个可以进行在线多人语音聊天和语音会议的免费软件。
  • 咪咕音乐:咪咕音乐是中国移动倾力打造的正版音乐播放器
  • WPS Office:金山公司(Kingsoft)出品的办公软件,与微软 Office 兼容性良好,个人版免费。
  • Skype:一个使用人数众多的基于 P2P的 VOIP 聊天软件。

2、Qt安装

2.1 安装包下载

up讲得Qt版本是v5.14.2

在我们学习 Qt 之前必须要安装开发环境,本小节基于 Qt 自带的集成开发环境(IDE)为大家讲解一下响应的开发步骤。在这里我们基于 Window 平台 Qt 5.14.2 给大家讲解如何进行安装和相关配置。

Qt官方下载地址:https://download.qt.io/archive/qt/

关于这些编译套件跟大家做一个介绍,安装过程中根据自己的情况酌情选择即可。

  • MSVC2015 64-bit: Visual Studio 2015 使用的 64 位编译套件
  • MSVC2017 32-bit: Visual Studio 2017 使用的 32 位编译套件
  • MSVC2017 64-bit: Visual Studio 2017 使用的 64 位编译套件
  • MinGW7.3.0 32-bit: QtCreator 使用的 32 位编译套件
  • MinGW7.3.0 64-bit: QtCreator 使用的 64 位编译套件
  • UWP –> Universal Windows Platform: 用于 window 平台应用程序开发的编译套件

UWP 即 Windows 通用应用平台,在 Windows 10 Mobile/Surface(Windows平板电脑)/ PC/Xbox/HoloLens 等平台上运行,uwp 不同于传统 pc 上的 exe 应用,也跟只适用于手机端的 app 有本质区别。它并不是为某一个终端而设计,而是可以在所有 Windows10 设备上运行。

在这个窗口中除了选择必要的编译套件,还有一些非必要组件,常用的有以下两个:

  • Source: Qt 源码,另外 Qt 的一些模块运行需要的驱动没有提供现成的动态库需要自己编译,建议安装

  • Qt Charts: 用于绘制统计数据对应的图表,比如:折线图 / 曲线图等

默认的编译套件 MinGW -> Minimalist GNU for Windows

MinGW 提供了一套简单方便的 Windows 下的基于 GCC 程序开发环境。MinGW 收集了一系列免费的 Windows 使用的头文件和库文件;整合了 GNU 的工具集,特别是 GNU 程序开发工具,如经典 gcc, g++, make 等。

MinGW 是完全免费的自由软件,它在 Windows 平台上模拟了 Linux 下 GCC 的开发环境,为 C++ 的跨平台开发提供了良好基础支持,为了在 Windows 下工作的程序员熟悉 Linux 下的 C++ 工程组织提供了条件。

2.2 模块安装

  • UWP windows通用平台开发
  • Android 安卓开发
  • Sources 动态库的源码 (开发要求必安装)
  • Qt Charts 图表统计

2.3 环境变量设置

最终生成的exe文件,想要任意目录下都能加载成功,需要环境变量设置里面的动态库

在这里插入图片描述

2.4 Qt Creator

2.4.1 Qt Creator简介

​ Qt自带集成开发环境(IDE),名为Qt Creator。它可以在Linux、Mac OS X和Windows上运行,并提供智能代码完成、语法高亮、集成帮助系统、调试器和剖析器集成,还集成了所有主要的版本控制系统git、Bazaar。除了Qt Creator外,Windows上的开发人员还可以使用Qt的Visual Studio插件。也可以使用其他的IDE(如KDE上的KDevelop)。但当然绝不是必须使用任何IDE。

  1. Qt Creator 是编写Qt程序默认的一款IDE,当然也可以安装插件在VS开发

  2. 使用Qt Creator 创建的项目中不能含有中文

  3. Qt Creator 默认使用Utf8格式编码对文件字符进行编码

    • 字符必须编码后才能被计算机处理

    • 为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5

    • GB2312支持的汉字太少,1995年的汉字扩展规范GBK1.0,支持了更多的汉字

    • 2000年的GB18030取代了GBK1.0成为了正式的国家标准

    • Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方法

      • ​ utf8(常用)

      • ​ utf16

  4. 附加说明:Qt Creator 设置默认编码格式为 UTF-8

为了保证 QT的文件能在Windows 和Linux下都能正常打开,以及避免由于Windows下和Linux下编码不同而产生的中文字符乱码的问题,需统一代码中的字符编码。为了达到这个目的,需设置 QtCreator的默认编码为UTF-8.

在工具->选项 ->文本编辑器-> 行为
把默认编码改为 UTF-8
如果要把visual studio工程中的文件加在Qt中,要改文件语系。

在这里插入图片描述

2.4.2 基本功能介绍

1.设计UI界面

2.帮助文档 帮助---->索引------>Look for

通过 QtCreator 可以直接查阅 Qt 的帮助文档,里边对 Qt 框架提供的 API 做了非常详尽的介绍。

Release 生成的exe,进行过优化,生成代码量较小,调试时不会在断点处暂停

3、创建第一个Qt项目

3.1 创建一个Qt项目

1、创建基于窗口的 Qt 应用程序

在这里插入图片描述

2、指定项目的存储路径

在这里插入图片描述

项目名称根据需求自己指定即可
在指定项目的存储路径的时候, 路径中不能包含中文, 不能包含中文, 不能包含中文

3、指定默认的窗口类的名字以及窗口的类型

可以选择是否需要UI文件

4、选择编译套件,编译套件用于项目文件的编译,如果安装了多个编译套件,在这里选择其中一个就可以了。

5、选择版本控制工具,比如: git, svn 等,可以不指定。

4、讲解项目文件

4.1 讲解.pro文件

在项目文件中, 注释需要使用 #号(#)
项目编译的时候需要加载哪些底层模块
如果当前Qt版本大于4, 会添加一个额外的模块: widgets,在QT4版本中widgets属于gui
Qt 5中对gui模块进行了拆分, 将widgets独立出来了

在创建的 Qt 项目中自动生成了一个后缀为 .pro 的项目文件,该文件中记录着项目的一些属性信息,具体信息如下:

#-------------------------------------------------
#
# Project created by QtCreator 2022-08-26T10:39:06
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = hellQt_20220826
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.

#如果在项目中调用了废弃的函数, 项目编译的时候会有警告的提示 
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11
    
    
# 项目中的源文件
SOURCES += \
        main.cpp \
        helloqt.cpp
    
# 项目中的头文件
HEADERS += \
        helloqt.h
    
    
# 项目中的窗口界面文件
FORMS += \
        helloqt.ui

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

一般不需要修改.pro文件

QT       += core gui
(QT_MAJOR_VERSION, 4): QT += widgets//高于QT4版本 则需要额外添加widgets模块。 该宏是为了兼容性
CONFIG += c++11 //兼容c++11 新特性

使用过时的函数编译器会发出警告

DEFINES += QT_DEPRECATED_WARNINGS
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.



# 下面的定义会让你的编译器在你使用时发出警告
# Qt 的任何被标记为弃用的特性(确切的警告
# 取决于你的编译器)。 请查阅相关文档
# 不推荐使用的 API,以便了解如何将您的代码从其中移植

**建立工程时自动添加 .cpp .h .ui ** (源文件,头文件,UI文件)

SOURCES += \
        main.cpp \
        helloqt.cpp

HEADERS += \
        helloqt.h

FORMS += \
        helloqt.ui

需要添加第三方的库,后面再讲解

.pro 文件使用#号添加注释

4.2 讲解程序的入口函数main.cpp文件

在这个源文件中有程序的入口函数 main(),下面给大家介绍下这个文件中自动生成的几行代码

#include "helloqt.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    helloQt w;
    w.show();

    return a.exec();
}

要使用一个类,需要包含该类的头文件,类名就是头文件的名字

#include <QApplication>

QApplication 应用程序类,非常关键,负责整个窗口的事件处理机制,在任务队列

4.3 讲解.ui文件

在 Qt 中每一个窗口都对应一个可编辑的可视化界面(*.ui), 这个界面对应的是一个 xml 格式的文件,一般情况下不需要在 xml 格式下对这个文件进行编辑,关于这个文件结构了解即可。

XML全称是Extensible Markup Language,可扩展的标记语言,它是SGML(标准通用标记语言)的一个子集,与hxml文件不同的是,XML的作用只是数据保存和数据交换

<!-- 双击这个文件看到的是一个窗口界面, 如果使用文本编辑器打开看到的是一个XML格式的文件 -->
<!-- 看不懂这种格式没关系, 我们不需要在这种模式下操作这个文件。 -->
<!-- 这里只是给大家介绍这个文件的本质 -->
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget"/>
  <widget class="QMenuBar" name="menubar"/>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

4.4 讲解窗口界面对应的类的文件

4.4.1 mainwindow.h

mainwindow.h,这个文件是窗口界面对应的类的头文件。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>		// Qt标准窗口类头文件

QT_BEGIN_NAMESPACE
// mainwindow.ui 文件中也有一个类叫 MainWindow, 将这个类放到命名空间 Ui 中
namespace Ui { class MainWindow; }	
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT	// 这个宏是为了能够使用Qt中的信号槽机制

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;		// 定义指针指向窗口的 UI 对象
};
#endif // MAINWINDOW_H

4.4.2 mainwindow.cpp

这个文件是窗口界面对应的类的源文件。

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)	// 基于mainwindow.ui创建一个实例对象
{
    // 将 mainwindow.ui 的实例对象和 当前类的对象进行关联
    // 这样同名的连个类对象就产生了关联, 合二为一了
    ui->setupUi(this);
}

MainWindow::~MainWindow()//析构函数,释放内存
{
    delete ui;
}


#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)	// 基于mainwindow.ui创建一个实例对象
{
    // 将 mainwindow.ui 的实例对象和 当前类的对象进行关联
    // 这样同名的连个类对象就产生了关联, 合二为一了
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

Qt项目中的三个文件

  • mainwindow.h
  • mainwindow.cpp
  • mainwindow.ui

两个同名类的对象组合,捆绑在一起

5、Qt 中的窗口类

我们在通过 Qt 向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类,下拉菜单中有三个选项,分别为: QMainWindow、QDialog、QWidget 如下图:

Bass class 基类QMainWindow、QDialog、QWidget

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1sQ7x4AS-1662123587702)(Qt开发.assets/微信截图_20220827095225.bmp)]

5.1 基础窗口类

  • 常用的窗口类有 3 个

    • 在创建 Qt 窗口的时候,需要让自己的窗口类继承上述三个窗口类的其中一个
  • QWidget

    • 所有窗口类的基类,所有窗口类都具有QWidget的属性
    • Qt 中的控件 (按钮,输入框,单选框…) 也属于窗口,基类都是 QWidget
    • 可以内嵌到其他窗口中:没有边框
    • 可以不内嵌单独显示:独立的窗口,有边框
  • QDialog

    • 对话框类,后边的章节会具体介绍这个窗口
    • 不能内嵌到其他窗口中
  • QMainWindow

    • 有工具栏,状态栏,菜单栏,后边的章节会具体介绍这个窗口
    • 不能内嵌到其他窗口中

5.2 窗口的显示

  • 内嵌窗口

    • 依附于某一个大的窗口,作为了大窗口的一部分
    • 大窗口就是这个内嵌窗口的父窗口
    • 父窗口显示的时候, 内嵌的窗口也就被显示出来了
  • 不内嵌窗口

    • 这类窗口有边框,有标题栏
    • 需要调用函数才可以显示
    // QWidget是所有窗口类的基类, 调用这个提供的 show() 方法就可以显示将任何窗口显示出来
    // 非模态显示
    void QWidget::show();	// 显示当前窗口和它的子窗口
    
    // 对话框窗口的非模态显示: 还是调用show() 方法
    // 对话框窗口的模态显示
    [virtual slot] int QDialog::exec();
    

相关文章:

  • 四十四、模板层
  • Django-ORM 单表查询
  • 基础数据结构详解
  • 淘宝天猫店铺商品API,店铺商品分类接口代码对接教程
  • 神器 SpringDoc 横空出世!最适合 SpringBoot 的API文档工具来了
  • 剑指offer68-77二分查找、排序
  • vue filters过滤器分别在template和script中使用
  • ssm毕设项目基于Java的城市公交查询系统ac5p2(java+VUE+Mybatis+Maven+Mysql+sprnig)
  • unity sdk -AppLovin MAX 广告聚合平台接入+Firebase统计
  • C#手动填充DataSet
  • coreutils5.0 uname命令和源码分析
  • OpenGL入门(四)之纹理Texture
  • UDP和TCP协议发送接收数据
  • Apache Doris 快速学习大纲
  • FastFlow(5)---软件加速器 software accelerator
  • 「译」Node.js Streams 基础
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • emacs初体验
  • Java IO学习笔记一
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • RxJS: 简单入门
  • Spring Cloud Feign的两种使用姿势
  • ViewService——一种保证客户端与服务端同步的方法
  • VUE es6技巧写法(持续更新中~~~)
  • Vue实战(四)登录/注册页的实现
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 阿里云前端周刊 - 第 26 期
  • 程序员最讨厌的9句话,你可有补充?
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 记录一下第一次使用npm
  • 坑!为什么View.startAnimation不起作用?
  • 聊聊sentinel的DegradeSlot
  • 前端
  • 协程
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (搬运以学习)flask 上下文的实现
  • (篇九)MySQL常用内置函数
  • (四)模仿学习-完成后台管理页面查询
  • (一)插入排序
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • ***检测工具之RKHunter AIDE
  • ***原理与防范
  • .form文件_一篇文章学会文件上传
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET企业级应用架构设计系列之开场白
  • .NET中使用Protobuffer 实现序列化和反序列化
  • @RestControllerAdvice异常统一处理类失效原因
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [20170713] 无法访问SQL Server
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [C#]winform部署yolov5-onnx模型