QT入门篇---无门槛学习

1.1 什么是 Qt

Qt 是⼀个 跨平台的 C++ 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应⽤程序,同时也可以使⽤ C++ 语⾔进⾏⾼级开发。
图形⽤⼾界⾯ :指采⽤图形⽅式显⽰的计算机操作⽤⼾界⾯,是计算机与其使⽤者之间的对话接⼝,是计算机系统的重要组成部分。如下分别是:Android ⼿机图形⽤⼾界⾯ 和 IOS ⼿机图形⽤⼾界⾯。
在这里插入图片描述
在这里插入图片描述

Qt 的优点

跨平台,⼏乎⽀持所有的平台;
• 接⼝简单,容易上⼿,学习 QT 框架对学习其他框架有参考意义。
• ⼀定程度上简化了内存回收机制;
• 开发效率⾼,能够快速的构建应⽤程序。
• 有很好的社区氛围,市场份额在缓慢上升。
• 可以进⾏嵌⼊式开发。

Qt 的应用场景

桌⾯应用程序
Qt 能够创建各种类型的桌⾯应⽤程序,包括⽂件管理器、媒体播放器、绘图程序等。Qt 应⽤程序⽀持多种操作系统,可以运⾏在 Windows、Linux、macOS 等桌⾯操作系统上。
移动应用程序
Qt ⽀持 Android 和 IOS 移动操作系统,为应⽤程序提供了强⼤的跨平台能⼒。可以使⽤ Qt 构建各种移动应⽤程序,例如社交应⽤、游戏、娱乐等。
嵌⼊式系统
Qt 在嵌⼊式领域应⽤⾮常⼴泛,它可以构建⾯向各种设备的图形应⽤程序,在机顶盒、⻋载娱乐系统、安防监控设备等领域具有⼴泛的应⽤。

Qt 的开发工具概述

Qt Creator

Qt Creator 是⼀个轻量级的跨平台集成开发环境(IDE),专为使⽤ Qt 框架进⾏应⽤程序开发⽽设计。
它是⼀个功能强⼤、易于使⽤、快速且⾼效的⼯具,被⼴泛⽤于编写各种类型的应⽤程序,如桌⾯应用程序、移动应⽤程序和嵌⼊式系统等。
Qt Creator 提供了⼀个可视化的界⾯设计器和代码编辑器,可以帮助开发者更快捷地创建复杂的用户界面和处理各种事件。
它还包含了调试⼯具、版本控制⼯具、⾃动完成和智能提⽰等功能,以及⽀持多语⾔和跨平台的开发环境。

使用 Qt Creator 新建项目

打开 Qt Creator ,在菜单栏中选中: “⽂件” --------> “新建⽂件或项⽬” ;或者使⽤快捷键:Ctrl +n;或者直接点击:“new”;
在这里插入图片描述
在这里插入图片描述

选择项目模板

在这里插入图片描述
新建项⽬对话框⾥有五类项⽬模板

项⽬模板说明
ApplicationQt 应⽤程序,包括普通窗体程序和 QtQuick 程序
Library可以创建动态库、静态库以及 Qt Quick 扩展插件、QtCreator ⾃⾝插件
其他项⽬可以创建单元测试项⽬、Qt4 设计师⾃定义控件、⼦⽬录项⽬等
Non-Qt-Project⾮ Qt 项⽬。可以创建纯 C 或纯 C++ 项⽬
Import Project导⼊项⽬。从版本控制系统管理的软件项⽬导⼊旧的项⽬

常⽤的只有第⼀类 Application,选择它,在右侧会看到 Qt 应⽤程序的五个⼦模板
Qt Widgets Application:普通窗体模板,传统基于部件的窗体界⾯程序。
• Qt Console Application:Qt 控制台应⽤程序。因为 Qt 主要⽤于图形界⾯设计,这个控制台项⽬模板基本不⽤。
• Qt for Python:在Python下⽤ LGPL 的许可来开发闭源 Qt 软件。
• Qt Quick Application: Qt 提供的⼀种⾼级⽤⼾界⾯技术,使⽤它可以方便快速的为移动以及嵌⼊式设备开发流畅美观的⽤⼾界⾯。Qt Quick 模块是开发 QML 应⽤的标准库,提供了使⽤ QML 创建⽤⼾界⾯所需的⼀切,包括可视化、交互、动画、模型、视图、粒⼦效果以及着⾊效果等。
在这里插入图片描述
Qt 中的构建⼯具有三种可供选择,分别是:qmake、CMake、Qbs,下⾯依次介绍。
qmake: qmake 是⼀个构建⼯具(build tool),⽤于⾃动⽣成 makefile ⽂件。qmake ⽀持跨平台构建。qmake 编辑的是⼀个后缀名为 .pro 的⽂件。
• CMake:CMake 是⼀个跨平台的构建⼯具。CMake 本⾝不是⼀个编译器,其实就是⽣成⼀个让编译器能读懂编译流程的⽂件⼯具。让 CMake ⾃动⽣成构建系统,例如 Makefile 和 Visual Studio
项⽬⽂件。CMake 是⼀个第三⽅⼯具,有⾃⼰的⽂档。
• Qbs:Qbs(Qt Build Suite:Qt构建套件)同 qmake、CMake ⼀样都是构建⼯具。Qbs 号称是新⼀代的构建⼯具,⽐ qmake 编译速度更快。Qbs 没有绑定 Qt 版本,它从项⽬⽂件的⾼级项⽬描述中⽣成⼀个正确的依赖表。⽽传统的 MakeFile ⽣成⼯具如 qmake 和 CMake ,其在⽣成 MakeFile⽂件后将实际的命令交给 Make ⼯具去执⾏。
在这里插入图片描述

认识 Qt Creator 界面

在这里插入图片描述
在编辑模式下,左边竖排的两个窗⼝叫做 “边栏” 。① 是项⽬⽂件管理窗⼝,② 是打开⽂件列表窗⼝。在 QtCreator 菜单 “控件” -------> “Show Left Sidebar”,或者使⽤快捷键:“Alt + 0” 可以控制边栏的显⽰和隐藏。

代码编辑区

在这里插入图片描述

UI设计界面

双击 widget.ui ⽂件,Qt Creator 会⾃动进⼊设计模式,可以对图形界⾯进⾏可视化编辑:
在这里插入图片描述
①:组件选择窗⼝。组件选择窗⼝分为多个组,如 Layouts、Buttons、Display Widgets 等,界⾯设计的常⻅组件都可以在组件选择窗⼝中找到。
②:UI 设计窗⼝。如果要将某个组件放置到该窗⼝上时,从组件选择窗⼝上拖放⼀个组件到窗体上即可。
③:动作编辑窗⼝。动作编辑窗⼝包括 Action Editor 以及 Signals 和 Slots 编辑器。 Action Editor 主要是⽤来新建 Action,并且通过拖拽的动作,将新建好的 Action 添加到菜单栏和⼯具栏上;Signals和 Slots 编辑器⽤于可视化地进⾏信号与槽的关联。
④:对象浏览窗⼝。⽤树状视图显⽰窗体上各组件之间的布局包含关系,视图有两列,显⽰每个组件的对象名称(ObjectName)和类名称。
⑤:属性设置窗⼝。显⽰某个选中的组件或窗体的各种属性及其取值,可以在属性设置窗⼝⾥修改这些属性的值。

Qt Hello World 程序

使⽤ “按钮” 实现

纯代码⽅式实现

在这里插入图片描述
在这里插入图片描述

可视化操作实现

(1)双击:" widget.ui " ⽂件;
在这里插入图片描述
(2)拖拽控件⾄ ui 界⾯窗⼝并修改内容;
在这里插入图片描述

使⽤ “标签” 实现

纯代码⽅式实现

在这里插入图片描述

可视化操作实现

(1)双击:" widget.ui " ⽂件;
在这里插入图片描述
(2)拖拽 “标签” ⾄ UI 设计界⾯中,并双击修改标签内容;
在这里插入图片描述

项目⽂件解析

.pro ⽂件解析

⼯程新建好之后,在⼯程⽬录列表中有⼀个后缀为 “.pro” 的⽂件, “.pro” ⽂件就是⼯程⽂件 (project),它是 qmake ⾃动⽣成的⽤于⽣产 makefile 的配置⽂件。如图所⽰:
在这里插入图片描述

双击进⼊该⽂件,该⽂件的核⼼内容如下:
QT += core gui // Qt 包含的模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //⼤于 Qt4 版本才包含 widget 模块
TARGET = QtFirst //应⽤程序名⽣成的 .exe 程序名称
TEMPLATE = app //模板类型,应⽤程序模板
SOURCES += main.cpp\ //源⽂件
widget.cpp //源⽂件
HEADERS += widget.h //头⽂件

widget.h ⽂件解析

在Qt中,如果要使⽤信号与槽(signal 和 slot)的机制 就必须加⼊ Q_OBJECT 宏;
Ui::Widget *ui; 这个指针是⽤前⾯声明的 namespace Ui ⾥的 Widget 类定义的,所以指针 ui 是指向可视化设计的界⾯,后⾯要访问界⾯上的组件,都需要通过这个指针 ui 去访问。
在这里插入图片描述

main.cpp ⽂件解析

使⽤ Qt Creator 新建任意⼯程之后,main.cpp ⽂件中都会⾃动⽣成如下代码
在这里插入图片描述

  1. Qt 系统提供的标准类名 声明头⽂件没有 .h 后缀;
  2. Qt ⼀个类对应⼀个头⽂件,类名 就是 头⽂件名;
  3. QApplication 为应⽤程序类;QApplication a;(a为应⽤程序对象,有且仅有⼀个。)
    ⚫ QApplication 管理图形⽤⼾界⾯应⽤程序的控制流和主要设置。
    ⚫ QApplication 是 Qt 的整个后台管理的命脉。它包含主事件循环,在其中来⾃窗⼝系统和其它
    资源的所有事件处理和调度。它也处理应⽤程序的初始化和结束,并且提供对话管理。
    ⚫ 对于任何⼀个使⽤ Qt 的图形⽤⼾界⾯应⽤程序,都正好存在⼀个 QApplication 对象,⽽不论
    这个应⽤程序在同⼀时间内是不是有 0、1、2 或更多个窗⼝。
  4. myWidget w; //实例化窗⼝对象
  5. w.show(); //调⽤show函数显⽰窗⼝
  6. a.exec() :程序进⼊消息循环,等待对⽤⼾输⼊进⾏响应。这⾥ main()把控制权转交给Qt,Qt 完
    成事件处理⼯作,当应⽤程序退出的时候 exec() 的值就会返回。在 exec() 中,Qt 接受并处理⽤⼾
    和系统的事件并且把它们传递给适当的窗⼝部件。

widget.cpp ⽂件解析

在这里插入图片描述

认识对象模型(对象树)

在 Qt 中创建很多对象的时候会提供⼀个 Parent 对象指针,下⾯来解释这个 parent 到底是⼲什么的。
• QObject 是以对象树的形式组织起来的。
◦ 当创建⼀个 QObject 对象时,会看到 QObject 的构造函数接收⼀个 QObject 指针作为参数,这个参数就是 parent,也就是⽗对象指针。
◦ 这相当于,在创建 QObject 对象时,可以提供⼀个其⽗对象,我们创建的这个 QObject 对象
会⾃动添加到其⽗对象的 children() 列表。
◦ 当⽗对象析构的时候,这个列表中的所有对象也会被析构。(注意,这⾥的⽗对象并不是继承意义上的⽗类!)
这种机制在 GUI 程序设计中相当有⽤。例如,⼀个按钮有⼀个 QShortcut(快捷键)对象作为其⼦对象。当删除按钮的时候,这个快捷键理应被删除。这是合理的。
• QWidget 是能够在屏幕上显⽰的⼀切组件的⽗类。
◦ QWidget 继承⾃ QObject ,因此也继承了这种对象树关系。⼀个孩⼦⾃动地成为⽗组件的⼀个⼦组件。因此,它会显⽰在⽗组件的坐标系统中,被⽗组件的边界剪裁。例如,当⽤⼾关闭
⼀个对话框的时候,应⽤程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该⼀起被删除。事实就是如此,因为这些都是对话框的⼦组件。
◦ 当然,我们也可以⾃⼰删除⼦对象,它们会⾃动从其⽗对象列表中删除。⽐如,当我们删除了⼀个⼯具栏时,其所在的主窗⼝会⾃动将该⼯具栏从其⼦对象列表中删除,并且⾃动调整屏幕显⽰。
Qt 引⼊对象树的概念,在⼀定程度上解决了内存问题。
• 当⼀个 QObject 对象在堆上创建的时候,Qt 会同时为其创建⼀个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
• 任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则⾃动将其从 parent 的children() 列表中删除;如果有孩⼦,则⾃动 delete 每⼀个孩⼦。Qt 保证没有 QObject 会被delete 两次,这是由析构顺序决定的。
Qt 引⼊对象树的概念,在⼀定程度上解决了内存问题。
当⼀个 QObject 对象在堆上创建的时候,Qt 会同时为其创建⼀个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则⾃动将其从 parent 的children() 列表中删除;如果有孩⼦,则⾃动 delete 每⼀个孩⼦。Qt 保证没有 QObject 会被delete 两次,这是由析构顺序决定的。
如果 QObject 在栈上创建,Qt 保持同样的⾏为。正常情况下,这也不会发⽣什么问题。来看下⾯的代码⽚段:
在这里插入图片描述
作为⽗组件的 window 和作为⼦组件的 quit 都是 QObject 的⼦类(事实上,它们都是QWidget的⼦
类,⽽QWidget 是 QObject 的⼦类)。这段代码是正确的,quit 的析构函数不会被调⽤两次,因为标准 C++ 要求,局部对象的析构顺序应该按照其创建顺序的相反过程。因此,这段代码在超出作⽤域时,会先调⽤ quit 的析构函数,将其从⽗对象 window 的⼦对象列表中删除,然后才会再调⽤window 的析构函数。
但是,如果我们使⽤下⾯的代码:
在这里插入图片描述
情况⼜有所不同,析构顺序就有了问题。我们看到,在上⾯的代码中,作为⽗对象的 window 会⾸先被析构,因为它是最后⼀个创建的对象。在析构过程中,它会调⽤⼦对象列表中每⼀个对象的析构函数,也就是说, quit 此时就被析构了。然后,代码继续执⾏,在 window 析构之后,quit 也会被析构,因为 quit 也是⼀个局部变量,在超出作⽤域的时候当然也需要析构。但是,这时候已经是第⼆次调⽤ quit 的析构函数了,C++ 不允许调⽤两次析构函数,因此,程序崩溃了。
由此我们看到,Qt 的对象树机制虽然在⼀定程度上解决了内存问题,但是也引⼊了⼀些值得注意的事情。这些细节在今后的开发过程中很可能时不时跳出来烦扰⼀下,所以,我们最好从开始就养成良好习惯。
注意:在 Qt 中,尽量在构造的时候就指定 parent 对象,并且⼤胆在堆上创建。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RUST笔记 FireDBG| Rust 代码调试器

安装https://firedbg.sea-ql.org/blog/2023-12-12-introducing-firedbg/ 更新VSCODE sudo dpkg -i code_1.85.2-1705561292_amd64.deb 安装FireDBG binaries (base) pddpdd-Dell-G15-5511:~$ curl https://raw.githubusercontent.com/SeaQL/FireDBG.for.Rust/main/install.sh …

[极客大挑战 2019]PHP1

知识点: 1.序列化的属性个数大于实际属性个数可以绕过_wakeup() 详见[CTF]PHP反序列化总结_ctf php反序列化-CSDN博客 2.private属性类名和属性名前都会有多一个NULL,phpstorm运行结果可以显示出来,但是复制出去会变成空格,要手动…

【Single Cell Genomics】Part2 Deep representation learning (form theislab)

文章目录 7 Deep representation learning in single cell genomics7.1 scanpy7.2 DCA7.3 scGen: predicting single-cell perturbation effects7.4 Human cell atlas 来自Manolis Kellis教授(MIT计算生物学主任)的课 YouTube:Single Cell Ge…

关于达梦认证DCA DCP,TIDB认证PCTA PCTP考试那点事儿

文章最后有彩蛋,一定要看到最后... 一、正确的道路上遇到正确的你 伴随中国数据库领域的快速技术进步,国内数据库生态蓬勃发展,并不断涌现出极具创新力的产品,推动了数据库应用的遍地开花。截至2024年1月,墨天轮数据社…

SWMM模型INP解析

.INP文件解析 [OPTIONS]:SWMM软件运行前需要设置的参数 [RAINGAGES]雨水节点,核心设置雨水时间序列,可为INP内部数据也可为外部txt数据,TIMESERIES对应【TIMESERIES】模块,TS_1为时间序列名称 [TIMESERIES]&#xff0…

红黑树底层实现

什么是红黑树 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red(红)或Black(黑),它是一种比AVL树在使用上更优秀的树,通过对任何一条从根…

微信小程序开发position等于static、relative、absolute、fixed、stricky时元素显示详细介绍

No Position 不设置position时显示,以红色元素做测试: Static 元素根据界面正常流进行定位。top、right、bottom、left 和 z-index 属性不起作用。这是默认值。 红色元素设置position: static,显示如下: Relative 元素根据界面正常流进行定位。以元素当前位置为基准,根…

g2o--ba代码解析

概要 g2o是常用的图优化理论c库,其自带了很多example讲解如何使用该库文件,本文分析其中ba的示例代码。 所谓的图优化,就是把一个常规的优化问题,以图(Graph)的形式来表述。 在图中,以顶点表…

单片机介绍

本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! > 发布人:日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

Spring Boot 模块工程(通过 Maven Archetype)建立

前言 看到我身边的朋友反馈说,IDEA 新建项目时,如果通过 Spring Initializr 来创建 Spring Boot , 已经无法选择 Java 8 版本,通过上小节的教程,不知道该如何创建 Spring Boot 模块工程。如下图所示: 一.IDEA 搭建 …

记录一下uniapp 集成腾讯im特别卡(已解决)

uniapp的项目运行在微信小程序 , 安卓 , ios手机三端 , 之前这个项目集成过im,不过版本太老了,0.x的版本, 现在需要添加客服功能,所以就升级了 由于是二开 , 也为了方便 , 沿用之前的webview嵌套腾讯IM的方案 , 选用uniapp集成ui ,升级之后所有安卓用户反馈点击进去特别卡,几…

【深度学习】CodeFormer训练过程,如何训练人脸修复模型CodeFormer

文章目录 BasicSR介绍环境数据阶段 I - VQGAN阶段 II - CodeFormer (w0)阶段 III - CodeFormer (w1) 代码地址:https://github.com/sczhou/CodeFormer/releases/tag/v0.1.0 论文的一些简略介绍: https://qq742971636.blog.csdn.net/article/details/134…

Mysql索引相关学习笔记:B+ Tree、索引分类、索引优化、索引失效场景及其他常见面试题

前言 索引是Mysql中常用到的一个功能,可以大大加快查询速度,同时面试中也是经常碰到。本文是学习Mysql索引的归纳总结。 索引采用的数据结构——B 树 本部分主要是参考自小林Coding B树的由来 二分查找可以每次缩减一半,从而提高查找效率…

【mongoDB】数据库的创建和删除

目录 1. 查看所有数据库 2.创建数据库 3.查看当前连接的数据库 4.删除数据库 1. 查看所有数据库 show dbs 2.创建数据库 use 数据库名 例如创建一个名为 aaa 的数据库 3.查看当前连接的数据库 db 4.删除数据库 use 数据库名 db.dropDataBase() 比如删除数据库 aaa

1.25号c++

1.引用 引用就是给变量起别名 格式: 数据类型 &引用名 同类型的变量名 (& 引用符号) eg: int a 10; int &b a; //b引用a,或者给a变量取个别名叫b int *p; //指针可以先定义 后指向 p &a; //int &a…

【MySQL】如何通过DDL去创建和修改员工信息表

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-fmKISDBsFq74ab2Z {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

docker(第二部分)

来自尚硅谷杨哥 少一点胡思乱想,心中无女人,编码自然神,忘掉心上人,抬手灭红尘。人间清醒,赚钱第一。好好学习,天天向上。听懂六六六。 7.Dokcer容器数据卷 1,)坑:容器卷记得加入 …

shared_ptr 与 unique_ptr 的转换 笔记

推荐B站文章: 6.shared_ptr与unique_ptr_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p6&vd_sourcea934d7fc6f47698a29dac90a922ba5a3我的往期文章: 独占指针:unique_ptr 与 函数调用-CSDN博客https://blog.csdn.n…

银行数据仓库体系实践(5)--数据转换

数据转换作业主要是指在数据仓库内的结构化数据批量加工,对于非结构化数据以及在线查询接口、数据流的开发主要是遵循代码开发规范以及各中间件的开发规范,如使用java来开发遵守java开发规范,使用Kafka需要遵循Kafka的使用和设计规范。同时做…

对话泛能网程路:能源产业互联网,行至中程

泛能网的能源产业互联网的标杆价值还不仅于此。其在产业互联之外,也更大的特殊性在于其也更在成为整个碳市场的“辅助运营商”,包括电力、碳等一系列被泛能网帮助企业改造和沉淀的要素资产,都在构成着碳交易市场的未来底层。 这恰是产业互联…
最新文章