QT学习日记 | 初始QT

news2025/1/19 23:01:53

目录

一、创建QT文件

二、目录结构讲解

1、.pro文件

2、源文件与头文件

3、编译运行

4、界面文件

三、梦开始的地方(Hello World!)

1、代码方式

2、拖拽方式

四、Qt中的“容器”

五、Qt的对象树机制

1、对象树的引入 

2、对象树的概念讲解


一、创建QT文件

        首先我们打开Qt Creator,如下所示;

        由于可能大家版本不同,可能有的会是如下界面,不过用法都相同;

        我们在欢迎界面中点击创建,会弹出如下如下页面;此时第一列我们选择第一个,表示我们要创建一个应用程序,其中第二个是基于Python的;

        然后我们在第二列中我们选择第一个表示我们要创建一个桌面应用程序,第二个表示我们要创建一个控制台的Qt程序;这里我们选择第一个 Qt Widgets Application

        接着会弹出下面这个窗口,我们设置项目名和项目路径,小编这里起的项目名为24_01_28_HelloWorld_1

        接着我们要选择编译我们项目的编译器;这里我们选择qmake即可,大部分情况都会选择qmake;

        这里我们要为我们接下来创建的窗口程序创建一个类,这里我们选择QWidget作为基类,最基本的窗口程序类;

        对于基类的选择,目前有如下三种;如下所示;

QMainWindow:主窗口类,一般用于较为复杂的程序应用,除了中央客户区界面,还包括菜单栏,工具栏,状态栏等多个可停靠的工具对话框等;

QWidget:最简单,最基础的窗体程序,里面可放置多个控件;

QDialog:对话框程序,一般用户弹窗;

这么一介绍,可能还是很懵,不过也很正常,这个在后面学习中可以慢慢体会;

        接下来是语言和翻译文件的选择,这里用于国际化软件,一般当我们的软件需要多种语言时,我们才会设置这一栏,这里我们直接点击下一步即可;

        这一步时选择编译工具,小编当时安装了很多编译软件,所以这里有多个,这里我们选择一个即可;

        选择版本控制系统,这里若你有版本控制可以选择Git,若没有选择None即可;

        这样,我们一个完整的项目就创建好了;

        我们发现左边项目文件管理区域中会存在三个默认目录,一个是头文件,一个是源文件,还有一个是界面文件;下面我会依次讲解这三个目录下的文件;

二、目录结构讲解

1、.pro文件

        首先,我们不难发现的是目录结构中,第一个.pro文件,这个文件就是qmake编译的文件,可以理解成我们之前写过的makefile文件;如下所示;

2、源文件与头文件

        我们首先从main.cc这个源文件开始看起;

        首先我们需要使用一个QApplication的类,无论是哪个QT程序都需要这个类,我们将命令行参数传递给这个类,接着我们创建一个Widget的类,这个类也就是我们一开始创建的那个类,继承自QWidget,我们通过继承方法show来显示这个控件,同时我们也可以通过hide来隐藏这个控件,最后返回时,我们调用exec方法,这个方法会将程序控制权交给我们的QT,等待用户交互,直至用户想要退出程序后,该函数才会返回;

        widget.h文件理解;

        widget.cc文件理解;

        特别注意的是setupUi主要是绑定界面目录下的Ui文件,是当前类与界面目录下某一Ui文件绑定关系的函数;

3、编译运行

        我们可以点击项目页面左下角的三角形编译运行项目;

        不一会,我们会发现弹出一个窗口,这个窗口就是我们代码的运行结果;

4、界面文件

        我们点击界面文件目录下的widget.ui文件,Qt Creator会帮我们弹出一个设计师页面,我们在这个设计师页面下可以通过手动拖拽的方式开发Qt程序;如下所示;

        我们可以通过拖拽的方式将左边控件拖拽到设计师页面中来完成Qt程序的设计,这个过程中会自动生成代码;我们点击左边菜单栏中的编辑回到项目文件中;

        此时我们看到的代码才是我们刚才设计师页面中的真实样貌;每当我们进行拖拽时,会自动生成相应的代码;

三、梦开始的地方(Hello World!)

        接下来我将用两种方式来编写一个Hello World程序;

1、代码方式

        在这之前,首先我向大家介绍一个小控件——QLable;

        QLable就是标签控件,与html中的标签类似;我们使用这个控件前,需要引入头文件QLable,在Qt中,一般来说,我们使用的类的头文件与类名同名;

        我们在widget.cc文件中,QWidget的构造函数内编写如上代码,我们便完成了一个Hello World程序,其中关于对象树的知识暂时不介绍,还有这个对象必须是new出来的;我们观察一下程序运行结果,如下所示;

2、拖拽方式

        我们将刚才写的代码注释掉;然后点击界面文件中的 widget.ui 文件;我们在控件中找到Label;

        我们直接可以将控件拖拽到设计师页面中,右下角,我们可以设置控件属性;

        到这一步,我们的程序已经完成了,我们直接点运行,如下所示;

四、Qt中的“容器”

        在C++中,STL容器的学习是必不可少的,可由于Qt某些历史原因,Qt也实现了自己的一套容器,比如Qt的序列式容器,QString、QList、QLinkedList、QVector、QStack、QQueue;

关联式容器:QMap、QMultiMap、QHash、QMultiHash、QSet;

        其接口使用与我们STL容器的使用大体一致,在进行Qt开发中,我们还是仍然建议使用Qt为我们提供的容器;

五、Qt的对象树机制

1、对象树的引入 

        再次回到我们上述使用代码方式实现Hello World程序的代码;我们将代码中堆上创建的QLabel标签改为在栈上创建,那么会有什么现象发生呢?

        我们惊奇的发现,窗口程序上居然什么都没有显示,这是为什么呢?

        实际上,这是因为我们由于是在栈上创建的label标签,而我们创建的标签的生命周期随Widget构造函数的生命周期,当我们出Widget构造函数时,此时我们的label对象会自动销毁,所以我们就看不到我们的label标签,这也就是为什么我们在堆上创建label标签,此时创建的label标签不会出构造函数后自动销毁;

        由于我们可能会存在大量在堆上创建的对象,这时很难保证每次编写的程序都不会出现内存泄漏的问题,因此此时Qt为我们提供了一套半自动的内存回收机制;既然是半自动,那就肯定不会像Java一样,完全不用我们管内存回收的问题,我们还是的手动操作一下,这就设计我们接下来要讲解的对象树的概念;

2、对象树的概念讲解

        Qt是通过对象树来完成资源自动回收,这个对象树,实际上就是一个多叉树;假设我们最开始有一个控件Widget,在这个控件里,我们有三个子控件,而其中一个子控件里,又有两个个子控件,如下所示;

        此时我们若给每个控件指定其父控件,这样我们在销毁父控件时,分别找到其子控件,先将子控件销毁后,在销毁父控件,这样,我们就可以减少内存泄漏的发生了;因此,在上述代码中,我们传入this指针,实际上是给我们创建的那个控件指定父控件,形成对象树;

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

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

相关文章

【学网攻】 第(13)节 -- 动态路由(OSPF)

系列文章目录 目录 系列文章目录 文章目录 前言 一、动态路由是什么? 二、实验 1.引入 实验拓扑图 实验配置 实验验证 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学…

C++设计模式介绍:优雅编程的艺术

物以类聚 人以群分 文章目录 简介为什么有设计模式? 设计模式七大原则单一职责原则(Single Responsibility Principle - SRP)开放封闭原则(Open/Closed Principle - OCP)里氏替换原则(Liskov Substitution …

【RT-DETR有效改进】EfficientFormerV2移动设备优化的视觉网络(附对比试验效果图)

前言 大家好,我是Snu77,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持Re…

DjangoURL调度器(一)

一、介绍 当一个用户请求 Django 站点的一个页面,下面是 Django 系统决定执行哪个 Python 代码使用的算法: Django确定要使用的根URLconf模块,一般是在settings中的ROOT_URLCONF设置的值,但是如果传入 HttpRequest 对象具有一个ur…

Unity 开发过程中如何优化内存

在开发Unity游戏时,优化内存使用是非常重要的。这不仅可以提高游戏性能,还能保证游戏在各种设备上都能顺利运行。以下是一些关于如何在Unity中优化内存使用的建议: 1. 了解并监控您的内存使用情况:您可以使用Unity的Profiler工具…

《合成孔径雷达成像算法与实现》Figure5.17

clc clear close all距离向参数 R_eta_c 20e3; % 景中心斜距 Tr 25e-6; % 发射脉冲时宽 Kr 0.25e12; % 距离向调频率 Fr 7.5e6; % 距离向采样率 Nrg 256; % 距离线采样点数 Bw abs(Kr*Tr); …

使用 Ant Design Pro 初始化前端项目

一、使用 pro-cli 来快速的初始化脚手架 1. 打开终端,输入命令 # 使用 npm npm i ant-design/pro-cli -g # create 后面加要初始化的项目名称 pro create leapi-frontend 2. 报错 PS D:\code> pro create leapi-frontend pro : 无法加载文件 D:\tools\nodejs…

AI 电子书链接分享

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

短剧小程序分销系统开发:创新与机遇的融合

一、引言 随着移动互联网的快速发展,短剧作为一种新兴的娱乐形式,正逐渐成为人们生活中的一部分。短剧小程序分销系统的开发,不仅为短剧的传播提供了新的渠道,同时也为相关产业带来了新的商业机会。本文将探讨短剧小程序分销系统…

SpringBoot对Bean的管理

Bean扫描 Spring中使用标签扫描或者注解 Springboot中没有使用标签或者注解它是怎么扫描的我的controlelr,service等等 核心在于springboot启动类中的SpringBootApplication注解 此注解其实是一个组合注解 它组合了一个ComponentScan注解,相当于在启…

小游戏选型(二):第三方社交小游戏厂家对比,即构/声网/融云/云信等

前言: 上一篇文章我们主要介绍社交游戏化趋势,并分析了直播平台面临的买量贵、变现难等问题,探讨了小游戏作为新的运营变现玩法的优势。同时还列举了各大直播平台TOP5的小游戏。今天我们继续介绍小游戏系列内容,本文是该系列的第…

【Docker】快速入门手册

目录 1.概述 1.1.安装 1.2.阿里云镜像加速 1.3.运行原理 2.常用操作 2.1.帮助命令 2.2.镜像操作 2.3.容器操作 2.3.1创建、启动 2.3.2.退出、停止 2.3.3.进入交互式界面 2.3.4.守护式容器交互 2.3.5.查看 2.3.6.删除 2.3.7.拷贝 3.容器数据卷 3.1.概述 3.2.使…

阅读记录:RNNLOGIC: LEARNING LOGIC RULES FOR REASON-ING ON KNOWLEDGE GRAPHS

一、介绍 本文研究知识图谱推理的学习逻辑规则。 逻辑规则在用于预测时提供可解释的解释,并且能够推广到其他任务。现有方法要么面临在大搜索空间中搜索的问题(例如神经逻辑编程),要么由于奖励稀疏而导致优化无效(例…

Vue-Cli3 - 从安装 nodejs 配置环境 ~ 搭建 cli 脚手架项目全过程

目录 前言提示 一、安装 & 配置 nodejs 1.1、安装 nodejs 1.2、配置必要目录 1.3、配置环境变量 1.4、测试 安装&配置 是否成功 1.5、安装淘宝镜像 1.5、cnpm 安装(推荐安装) 二、vue-cli3 创建项目 2.1、vue-cli2 和 vue-cli3 主要区…

玩转WEB接口之三 【HTTPS证书申请】

文章目录 一、概述主要流程二、域名注册1. 购买域名2. 购买服务器3. 域名备案4. 域名解析 三、证书申请1. 申请途径2. 阿里云3个月免费SSL申请3. freessl 1年免费SSL申请 四、证书验证1. springboot 代码验证1.) 证书转换2.) 验证结果3.) 源码传送 2. nginx验证 一、概述 HTTP…

行测-资料:2. 一般增长率、增长量

1、一般增长率 1.1 百分数和百分点 50%,20% 1.2 增长率和倍数 1.5;50 1.3 成数和翻番 1.4 增幅,降幅,变化幅度 A,A,D B,高于全国增速 2.3 个百分点,21.8 - 2.3 19.5。 5%&#xff0…

数字图像处理(实践篇)三十四 OpenCV-Python绘制椭圆

目录 一 涉及的函数 二 实践 一 涉及的函数 cv2.ellipse(img,center,axes,angle,start_angle,end_angle,color,thickness) 参数: ①<

精品基于Uniapp+ssm宠物时光管理系统App

《[含文档PPT源码等]精品基于Uniappssm宠物时光管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;ssm 安卓框架&#xff1a…

【目标跟踪】多相机环视跟踪

文章目录 一、前言二、流程图三、实现原理3.1、初始化3.2、输入3.3、初始航迹3.4、航迹预测3.5、航迹匹配3.6、输出结果 四、c 代码五、总结 一、前言 多相机目标跟踪主要是为了实现 360 度跟踪。单相机检测存在左右后的盲区视野。在智能驾驶领域&#xff0c;要想靠相机实现无…

工厂生产管理MES系统,开源代码+维护

商业开源的一套超有价值的JAVA制造执行MES系统源码 亲测 带本地部署搭建教程 教你如何在本地运行运行起来。 开发环境&#xff1a;jdk11tomcatmysql8springbootmaven 需要源码&#xff0c;私信我获取&#xff0c;可以项目合作维护一、系统概述&#xff1a; MES制造执行系统&…