QT学习日记 | 初始QT

目录

一、创建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.mzph.cn/news/665145.shtml

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

相关文章

MySQL进阶之锁(全局锁以及备份报错解决)

锁 全局锁 全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语 句,已经更新操作的事务提交语句都将被阻塞。 其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定&#xff…

030-安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计

030-安全开发-JS应用&NodeJS指南&原型链污染&Express框架&功能实现&审计 #知识点: 1、NodeJS-开发环境&功能实现 2、NodeJS-安全漏洞&案例分析 3、NodeJS-开发指南&特有漏洞 演示案例: ➢环境搭建-NodeJS-解析安装&…

MySQL知识点总结(三)——事务

MySQL知识点总结(三)——事务 事务事务的四大特性ACID原子性一致性隔离性持久性 脏读、幻读、不可重复读脏读不可重复读幻读 隔离级别读未提交读已提交可重复读串行化 事务的原理InnoDB如何实现事务的ACID事务的两阶段提交redo log与binlog的区别事务两阶…

【DevOps】产品需求文档(PRD)与常见原型软件

文章目录 1、PRD介绍1.1、概述1.2、前提条件1.3、主要目的1.4、关键内容1.5、表述方式1.6、需求评审人员1.7、一般内容结构 2、需求流程3、常见原型软件3.1、Word3.2、Axure3.2.1、详细介绍3.2.2、应用分类3.2.3、优缺点 3.3、摹客RP3.4、蓝湖3.5、GUI Design Studio 1、PRD介绍…

业务流程自动化平台在制造业应用案例,助力业务自动化、智能化

捷昌驱动成立于2000年,并于2018年9月在上海证券交易所上市,是一家专注于线性驱动产品研发、生产及销售的科技集团。 公司整合全球资源,为智慧办公、医疗康护、智能家居、工业自动化等关联产业提供驱动及智能控制解决方案,以科技驱…

荣耀手机如何录屏?在线分享3个录屏方法

荣耀手机如何录屏?荣耀手机录屏是一项非常实用的功能,它可以帮助我们轻松记录手机屏幕上的内容,无论是游戏攻略、教育学习还是工作演示,都能够方便地进行录制。通过录屏,我们可以随时随地记录和分享自己的操作和见解。…

探究Steam爆款游戏”幻兽帕鲁“:玩家评价揭秘

探究Steam爆款游戏”幻兽帕鲁“:玩家评价揭秘 文章目录 探究Steam爆款游戏”幻兽帕鲁“:玩家评价揭秘1 背景描述2 数据说明3 数据来源4 问题描述5 数据探索与预处理5.1 数据加载5.2 数据清洗 6 数据分析6.1 评论分布分析6.2 评论内容情感分析6.3 地理分布…

力扣热门100题刷题笔记 - 2.两数相加

力扣热门100题 - 2.两数相加 题目链接:2.两数相加 题目描述: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返…

图书|基于Springboot的图书管理系统设计与实现(源码+数据库+文档)

图书管理系统目录 目录 基于Springboot的图书管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、个人中心 2、管理员管理 3、用户管理 4、图书出版社管理 5、公告类型管理 6、所在书架管理 7、图书类型管理 8、论坛管理 9、公告信息管理 10、图书信…

【数据结构】(分治策略)中位数的查询和最接近点对问题

中位数查询: 寻找一组字符串中第k小的数,返回其值和下标。 不可以有重复值(在缩小规模的时候,会导致程序死循环) 相对位置的转换体现了分治策略的思想。> 划分函数 int partition(int *nums,int left, int rig…

Jmeter 自动化性能测试常见问题汇总

一、request 请求超时设置 timeout 超时时间是可以手动设置的,新建一个 http 请求,在“高级”设置中找到“超时”设置,设置连接、响应时间为2000ms。 1. 请求连接超时,连不上服务器。 现象: Jmeter表现形式为&…

SQL sever2008中创建用户并赋权

一、创建数据库dream CREATE DATABASE dream; 二、创建登录用户XZS 法一:使用SSMS创建 通过查询 sys.syslogins 系统视图来确定当前登录是否具有系统管理员权限。执行以下查询语句: SELECT name, isntname FROM sys.syslogins WHERE sysadmin 1;选…

初始mach-o文件及在项目中应用

本文字数:2250字 预计阅读时间:15分钟 01 认识mach-o的必要性 了解mach-o的结构可以帮助认识系统加载二进制文件的动态链接和静态链接。应用层面,使用initialize的c函数计算启动时间耗时也需要以mach-o的结构知识为铺垫。还可以用在使用clang…

2、排列重要性 Permutation Importance

您认为模型哪些特性是重要的? 文章目录 1、简介2、工作原理3、代码示例4、解释排列重要性1、简介 对于模型来说,我们可能会问的最基本的一个问题是:哪些特征对预测影响最大? 这个概念被称为特征重要性。 有多种方法可以衡量特征重要性。一些方法回答了上面提到的问题的微…

怎么把几百M大小的视频做成二维码?扫码播放视频在线教程

怎么把几百M大小的视频做成一个二维码展示呢?通过二维码来作为视频的载体是现在很常用的一种手段,通过这种方式不仅成本比较低,而且传播速度也比较快,通过访问云端数据就可以播放视频。 视频二维码生成的方法一般会通过二维码生成…

C++模版初阶

前言 在本文我们将学习模版的基础知识点,了解泛型编程。 一、泛型编程 1、引入 我们如何实现一个通用的交换函数呢? 我们先看一段代码,如下: void Swap(int& left, int& right) {int temp left;left right;right te…

机器学习 | 如何利用集成学习提高机器学习的性能?

目录 初识集成学习 Bagging与随机森林 Otto Group Product(实操) Boosting集成原理 初识集成学习 集成学习(Ensemble Learning)是一种通过组合多个基本模型来提高预测准确性和泛化能力的机器学习方法。它通过将多个模型的预测结果进行整合或投票来做…

【Java程序设计】【C00243】基于Springboot的社区医院管理系统(有论文)

基于Springboot的社区医院管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的社区医院管理服务系统 本系统分为系统功能模块、管理员功能模块、用户功能模块以及医生功能模块。 系统功能模块:社…

ElementUI Form:Checkbox 多选框

ElementUI安装与使用指南 Checkbox 多选框 点击下载learnelementuispringboot项目源码 效果图 el-checkbox.vue &#xff08;Checkbox 多选框&#xff09;页面效果图 项目里el-checkbox.vue代码 <script> const cityOptions [上海, 北京, 广州, 深圳] export def…

JProfiler for Mac:提升性能和诊断问题的终极工具

在当今的高性能计算和多线程应用中&#xff0c;性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具&#xff0c;旨在帮助开发者更好地理解其应用程序的运行情况&#xff0c;提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括&#xff1a;…