【Qt】Qt入门

news2024/12/23 22:35:39

思维导图

学习目标

       这一系列是学习Qt,在C++中,会发现有不少岗位的要求是熟悉Qt,所以Qt的学习是不能推迟的。

一、Qt的概述

1.1 Qt的特点

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

  1. 具有短平快的优秀特质:投资少,见效快,效益高
  2. 几乎支持所有的平台,可用于桌面程序开发以及嵌入式开发
  3. 有属于自己的事件处理机制

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

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

Qt广泛应用于GUI程序(grapahical user interface),也可以用于非GUI程序

Qt有丰富的API:

  1. Qt包含多达250个以上的C++类
  2. Qt可以进行处理正则表达式

Qt支持2D/3D图形渲染,支持OpenGL

       OpenGL是很不错的,OpenGL可以做视频渲染,图像/视频编辑以及各种特效,游戏引擎,虚拟现实,3D建模等。

Qt给程序员提供了丰富且详细的官方文档,在Qt软件中也会配有官方文档,不过文档是全英文的

支持XML,JSON

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

1.2 Qt的模块

Qt类库中大量的类根据功能分为各种模块,这些模块分为一下几个类型:

  • Qt基本模块:提供了Qt在所有平台中的基本功能
  • Qt附加模块:实现一些特定功能的提供附加价值的模块
  • 增值模块:单独发布的提供额外价值的模块或工具
  • Qt工具:帮助应用程序开发的一些工具
模块描述
Qt CoreQt类库的核心,所有其他模块都依赖于这个模块
Qt GUI设计GUI界面的基础类,包括OpenGL
Qt Widget用于构建GUI界面的C++图形组件类

二、Qt的安装(重点)

我们先来点击这个下载路径(Qt下载链接),然后,再按下图进行操作

三、Qt软件的环境配置

在安装好Qt软件后,我们可以根据下图所示,进入qt软件的一些配置:

四、创建第一个Qt项目 

项目文件:一般不需要进行修改。

 源文件:

五、Qt中的三个窗口类

5.1 QWidget类型窗口的特点

  • 所有窗口类的基类
  • 可以内嵌到其他窗口的内部——无边框(需要给该窗口指定父窗口)
  • 可以作为独立的窗口显示——有边框(不能给该窗口指定父窗口)
  • Qt中所有控件的基类

5.2 QDialog类型窗口的特点

  • 对话框窗口类
  • 模态和非模态两种显示方式
  • 不能进行内嵌

模态和非模态 

模态: 

        在这个状态下,无法进行过窗口的切换,只能先将dialog窗口关闭,才能显示下一个窗口。

  Dialog* dig = new Dialog(this);
  dig->exec(); // 阻塞程序的进行

非模态:

       在这种状态下,可以进行窗口的切换

Dialog* dig = new Dialog(this); // 创建对话框
dig->show();

5.3 QMainWindow类型窗口的特点

  • 主窗口类
  • 可以包含菜单栏,工具栏,状态栏
  • 不能进行内嵌

5.4 窗口的显示

5.4.1 内嵌窗口

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

5.4.2 不内嵌窗口

  • 这类窗口有边框,有标题栏
  • 需要调用函数才可以显示
  • // Qwidget是所有窗口类的基类,调用这个提供的show()方法就可以显示将任何一个窗口显示出来
    void QWidget::show(); // 显示当前窗口和它的字窗口

六、Qt中的坐标体系

6.1 窗口的坐标原点

                                                     

       在Qt中,坐标原点是在左上角。水平从左边向右边延伸,数值增大,为X轴;竖直从上边向下边延伸,数值增大,为Y轴。在图像中,我们可以使用move()函数去执行图像的定位。

6.2 窗口的相对坐标

                                                   

  • 在Qt中的某一个窗口中有可能有若干个控件,这个控件都是嵌套的关系:A窗口包含B窗口,B窗口包含C窗口。
  • 每一个窗口都有坐标原点,在左上角,子窗口的位置是基于父窗口的坐标体系来确定的,也就是说通过父窗口左上角的坐标来确定自己的位置
  • Qt中窗口显示的时候使用的相对坐标相当于自己的父窗口
  • 将子窗口的位置通过父窗口进行移动
  • // 所有的窗口类的基类:QWidget
    // QWidget中提供了移动窗口的API函数
    // 参数 x, y 是要移动的窗口的左上角的掉,窗口的左上角移动到这个坐标点中
    void move(int x,int y);
    void move(const QPoint &);

举个例子:

// 创建一个按钮
QPushButton* btnA = new QPushButton(this);
// 使用move方法,移动按钮的位置
btnA->move(10, 10);

七、Qt中的内存回收机制

       在Qt中创建对象的时候会提供一个Parent对象指针(可以查看类的构造函数),下面来解释一下这个parent到底是什么?

       QObject是以对象树的形式组织起来,当你创建一个QObject的构造函数时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是parent,也就是父对象指针。这相当于在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动的添加到其父对象的children()的列表中。当父对象析构时,这个列表中的所有对象都会进行析构。

       QWidget是能够在屏幕上显示一切组件的父类。QWidget继承于QObject,因此也继承了这种对象树的关系。一个孩子会自动的成为父组件的一个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框时,应用程序将其删除,那么,这个对话框中的按钮、图标等会被一起删除。

Qt引入对象树的概念,在一定程度上解决了内存问题:

  •        当一个QObject对象在堆上进行创建时,Qt会同时为其创建一个对象树。不过,对象树中对象的创建顺序是没有规律的。这就意味着,这些函数析构的顺序是未定义的。
  •        任何一个对象树中的QObject对象在delete的时候,如果这个对象有parent,则自动将其从parent的children()的列表进行删除;如果有孩子,则自动的delete每一个孩子。Qt保证每一个QObject对象不会被析构两次,这是由析构顺序决定的。

       综上所述,我们可以得出一个结论:Qt有内存回收机制,但是并不是所有被new的对象被自动回收,满足条件才可以被回收。

需要满足下面两个条件:

  • 创建的对象必须是QObject类的子类(间接子类也可以)。
  • QObject类是没有父类的,Qt中有一大部分类都是从这个类派生出去的,Qt中使用频率很高的窗口类和控件都是QObject的直接或间接子类
  • 创建出来的类必须要指定其父对象是谁,一般情况下有两种操作方式:
  • // 方法一:通过构造函数
    // parent:当前窗口的父对象,找出构造函数中的parent参数即可
    QWidget::QWidget(QWidget * parent = Q_NULLPIR, Qt::WindowFLAGs f = Qt::WindowFlags());
    QTimer::QTimer(QObject * parent = nullptr);
    
    // 方法二:通过setParent()方法
    // 假设这个控件没有在构造的时候指定父对象,可以调用QWidget的api指定父窗口对象
    void QWidget::setParent(QWidget* parent);
    void QObject::setParent(QObject* parent);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1700001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型额外篇章二:基于chalm3或Llama2-7b训练酒店助手模型

文章目录 一、代码部分讲解二、实际部署步骤(CHALM3训练步骤)1)注册AutoDL官网实名认证2)花费额度挑选GPU3)准备实验环境4)开始执行脚本5)从浏览器访问6)可以开始提问7)开始微调模型8)测试训练后的模型三、基于Llama2-7b的训练四、额外补充1)修改参数后2)如果需要访问…

windows安装SQL Server

1、下载 下载网页:SQL Server 下載 | Microsoft 2022版下载地址:https://go.microsoft.com/fwlink/p/?linkid2215158&clcid0x404&culturezh-tw&countrytw 下载结果:SQL2022-SSEI-Dev.exe 打开选第三个,下载介质&…

Cohere继Command-R+之后发布大模型Aya-23,性能超越 Gemma、Mistral 等,支持中文

前言 近年来,多语言大模型(MLLM)发展迅速,但大多数模型的性能依然存在显著差距,尤其是在非英语语言方面表现不佳。为了推动多语言自然语言处理技术的发展,Cohere团队发布了新的多语言指令微调模型家族——…

微信小程序文本框输入显示已经输入的字数

我们遇到这样的需求,就是微信小程序的输入框下面需要显示输入的字数: 我们通常会使用bindinput事件,让显示的字数等于value的长度,看下面的图: 但在实践中,真机测试中,我们会发现以下问题: 这个…

【C++】——入门基础知识超详解

目录 ​编辑 1.C关键字 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 命名空间的使用有三种方式: 注意事项 3. C输入&输出 示例 1:基本输入输出 示例 2:读取多个值 示例 3:处理字符串输入 示例 4:读…

2024年5月27日 十二生肖 今日运势

小运播报:2024年5月27日,星期一,农历四月二十 (甲辰年己巳月辛卯日),法定工作日。 红榜生肖:羊、蛇、狗 需要注意:鼠、鸡、龙 喜神方位:西南方 财神方位:…

vue3 vite项目配置了proxy代理情况下查看真实的接口调用地址

vite配置了proxy代理情况下如何查看真实的接口调用地址? 使用vite进行代理 在vite.config.ts配置了代理 在浏览器查看请求头和响应头发现只有代理前的url,没有显示代理后的路径 然后发现一个bypass函数,但是此函数只能修改res响应头的数据&#xff0…

指纹识别系统架构

目录 1. 系统架构 1.1 指纹采集模块 1.2 指纹处理模块 1.3 指纹登记模块 1.4 指纹识别模块 1.5 指纹识别决策模块 1.6 管理模块 1.6.1 存储管理 1.6.2 传输管理 1.6.3 安全管理 1.7 应用开放功能 1.7.1 指纹登记功能 1.7.2 指纹验证功能 1.7.3 指纹辨识功能 2. …

DM Hw6

Hw6 聚类 1ab 2abcd 3abcde 456789 1 a b 一个点不来自某个特定簇的概率是 1 − 1 K 1-\frac{1}{K} 1−K1​ 对所有 2 K 2K 2K 个点都不来自该簇的概率是 ( 1 − 1 K ) 2 K (1-\frac{1}{K})^{2K} (1−K1​)2K 则 至少一个点来自该簇的概率为 1 − ( 1 − 1 K ) 2 K 1-(1-…

vs2019 c++20 规范的 STL 库的智能指针 shared、unique 、weak 及 make_** 函数的源码注释汇总,和几个结论

智能指针的源码都在 《memory》 头文件中。因为头文件太长,再者本次整理是基于以前的零散的模板分析。故相当于抽取了该头文件中关于智能指针的源码进行分析,注释。 (1 探讨一)当独占指针指向数组时,其默认的删除器是…

二叉树——经典练习题

目录 前言: 一、单值二叉树 题目描述: 思路分析: 代码实现: 二、二叉树最大深度 题目描述: 思路分析: 代码实现: 三、检查两颗树是否相同 题目描述: 思路分析: 代…

EXCEL怎么计算一列数据里的最大连续重复次数?

有这样一列数据,怎么用EXCEL数据求出,重复出现的单/双的次数的最大值。 这里演示使用辅助列数据透视表。 一、单/双出现的次数的最大值 这个可不用辅助列,选中数据透视表将数据 单/双列放在行字段,和值字段,值字段会…

netplan

文章目录 前言官网配置文件默认配置NetworkManager 简介systemd-networkd 简介NetworkManager VS systemd-networkdNetplan 简介示例多个配置文件 前言 netplan 是 ubuntu 17.10 版本中引入的一种全新的命令行网络配置程序,用于在 ubuntu 系统中轻松管理和配置网络…

C语言 | Leetcode C语言题解之第114题二叉树展开为链表

题目: 题解: void flatten(struct TreeNode* root) {struct TreeNode* curr root;while (curr ! NULL) {if (curr->left ! NULL) {struct TreeNode* next curr->left;struct TreeNode* predecessor next;while (predecessor->right ! NULL)…

【DevOps】Jenkins + Dockerfile自动部署Maven(SpringBoot)项目

环境 docker_host192.168.0.1jenkins_host192.168.0.2 jenkins_host构建完成后把jar发布到docker_host,再通过dockerfile自动构建镜像,运行镜像 1 Jenkins安装 AWS EC2安装Jenkins:AWS EC2 JDK11 Jenkins-CSDN博客 AWS EC2上Docker安装…

此物一出天下反,Dora犹如优秀框架的粘合剂

引言:千里之行,始于足下。 如果你从事Android开发,请认真看完本篇文章,因为可能会颠覆你对Android开发的认识。 当夜空中繁星点点,一颗璀璨的流星划过,其辉光洒在古老的山谷之中,照亮了一个隐藏…

banner2.0自定义轮播布局

说明:最近碰到一个需求,让新闻列表实现轮播图的效果,也就是轮播新闻,然后样式必须按照ui设计的样式来弄,之前传统的banner,都是只轮播图片,没想到,这次居然要轮播新闻, 网…

夏老师小课堂(7) 免费撸Harmony0S应用开发者高级认证

点击上方 “机械电气电机杂谈 ” → 点击右上角“...” → 点选“设为星标 ★”,为加上机械电气电机杂谈星标,以后找夏老师就方便啦!你的星标就是我更新动力,星标越多,更新越快,干货越多! 关注…

C++ | Leetcode C++题解之第113题路径总和II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> ret;unordered_map<TreeNode*, TreeNode*> parent;void getPath(TreeNode* node) {vector<int> tmp;while (node ! nullptr) {tmp.emplace_back(node->val);node …

高效的大型语言模型适应方法:提升基础性的解决方案

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…