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指针,实际上是给我们创建的那个控件指定父控件,形成对象树;

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

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

相关文章

Java 的文件类的学习总结

目录 一、File 的创建 二、File 类的常用方法 一、File 的创建 二、File 类的常用方法

开始学习第二十五天(番外)

今天分享一下写的小游戏啦 头文件game.h #include<stdio.h> #include<time.h> #include<stdlib.h> #define H 3 #define L 3 void InitBoard(char Board[H][L], int h, int l); void DisplayBoard(char Board[H][L], int h, int l); void playermove(cha…

【开源】基于JAVA+Vue+SpringBoot的智慧家政系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服务4.2 新增单条服务订单4.3 新增留言反馈4.4 小程序登录4.5 小程序数据展示 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的智慧家政系统&#xff0…

OpenCV-29 自适应阈值二值化

一、引入 在前面的部分我们使用的是全局阈值&#xff0c;整幅图像采用同一个数作为阈值。当时这种方法并不适应于所有情况。尤其是当同一幅图像上的不同部分具有不同的亮度时。这种情况下我们需要采用自适应阈值。此时的阈值时根据图像上的每一个小区域计算与其对应的阈值。因此…

Less-1(sqlmap自动注入攻击)--sqli

环境准备 打开火狐浏览器&#xff0c;进入sqli第一关的页面 工具准备 sqlmap 参数解释 -u URL 指定目标URL进行注入测试。--dataDATA指定POST请求的数据进行注入测试--cookieCOOKIE指定用于身份验证的cookie进行注入测试-p PARAMETER指定要测试的参数--levelLEVEL设置测试的深…

微信小程序开发 逐级选择地区

1.需求 微信小程序开发,逐级选择地区&#xff08;市、区县、街道、社区、网格&#xff09;&#xff0c;选择每一级然后展示下一级数据。 微信小程序逐级选择 2. 完整代码 2.1. 选择界面 2.1.1. selectArea.wxml <text bindtap"selectGrid">{{gridName}}</…

Java技术栈 —— Hadoop入门(二)

Java技术栈 —— Hadoop入门&#xff08;二&#xff09; 一、用MapReduce对统计单词个数1.1 项目流程1.2 可能遇到的问题1.3 代码勘误1.4 总结 一、用MapReduce对统计单词个数 1.1 项目流程 (1) 上传jar包。 (2) 上传words.txt文件。 (3) 用hadoop执行jar包的代码&#xff0c;…

go语言基础之泛型

1.泛型 泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型。 1.1 为什么需要泛型 func reverse(s []int) []int {l : len(s)r : make([]int, l)for i, e : range s {r[l-i-1] e}return r }fmt.Println(reverse…

ACL、VLAN、NAT笔记

一、ACL ---访问控制列表 1.ACL的作用 1&#xff0c;访问控制&#xff1a;在路由器流量流入或流出的接口上&#xff0c;匹配流量&#xff0c;然后 执行设定好的动作。 ---- permit 允许 , deny 拒绝 2&#xff0c;抓取感兴趣流&#xff1a;ACL可以和其他服务结合使用。ACL只…

Mac安装nvm,安装多个不同版本node,指定node版本

一.安装nvm brew install nvm二。配置文件 touch ~/.zshrc echo export NVM_DIR~/.nvm >> ~/.zshrc echo source $(brew --prefix nvm)/nvm.sh >> ~/.zshrc三.查看安装版本 nvm -vnvm常用命令如下&#xff1a;nvm ls &#xff1a;列出所有已安装的 node 版本nvm…

CMake 完整入门教程(五)

CMake 使用实例 13.1 例子一 一个经典的 C 程序&#xff0c;如何用 cmake 来进行构建程序呢&#xff1f; //main.c #include <stdio.h> int main() { printf("Hello World!/n"); return 0; } 编写一个 CMakeList.txt 文件 ( 可看做 cmake 的…

导航页配置服务Dashy本地部署并实现公网远程访问

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

Unity 中介者模式 (实例详解)

文章目录 简介实例1&#xff1a;玩家与UI交互实例2&#xff1a;战斗模块中的攻击事件协调实例3&#xff1a;游戏场景中的事件广播实例4&#xff1a;模块间通信 - 地图导航与角色移动实例5&#xff1a;UI模块间同步 - 菜单切换与选项状态 简介 在Unity游戏开发中&#xff0c;中…

SpringBoot内置工具类

Collections java.util包下的Collections类&#xff0c;该类主要用于操作集合或者返回集合 一、排序 List<Integer> list new ArrayList<>();list.add(2);list.add(1);list.add(3);Collections.sort(list);//升序System.out.println(list);Collections.reverse(…

【机器学习】欠拟合与过拟合

过拟合&#xff1a;模型在训练数据上表现良好对不可见数据的泛化能力差。 欠拟合&#xff1a;模型在训练数据和不可见数据上泛化能力都很差。 欠拟合常见解决办法&#xff1a; &#xff08;1&#xff09;增加新特征&#xff0c;可以考虑加入特征组合、高次特征&#xff0c;以…

MySql45讲-08.事务到底是隔离的还是不隔离的?(结合MVCC视频)

命令的启动时机 begin/start transaction 命令并不是一个事务的起点&#xff0c;在执行到它们之后的第一个操作InnoDB表的语句&#xff0c;事务才真正启动。如果你想要马上启动一个事务&#xff0c;可以使用start transaction with consistent snapshot 这个命令。 事务的版本…

数据结构—基础知识(14):森林、树与二叉树的转换

数据结构—基础知识&#xff08;14&#xff09;&#xff1a;森林、树与二叉树的转换 将树转换为二叉树进行处理&#xff0c;利用二叉树的算法来实现对树的操作。由于树和二叉树都可以用二叉链表作存储结构&#xff0c;则以二叉链表作媒介可以导出树与二叉树之间的一个对应关系…

Nginx负载均衡下的webshell连接

一、上传AntSword-Labs-master搭建负载均衡实验环境 搭建好docker环境&#xff0c;并且配置好docker-compose 我的Redhat的docker版本&#xff1a; 查看当前环境下的文件是否正确&#xff1a; 接着执行docker compose up -d 拉取环境 访问成功页面&#xff1a; 进入docker容器…

RabbitMQ 死信交换机的详述➕应用

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于RabbitMQ的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一.什么是死信交换机 二. 死信队列…

C++1.0

思维导图 提示输入一个字符串&#xff0c;统计该字符中大写&#xff0c;小写字母个数&#xff0c;数字个数&#xff0c;空格个数以及特殊字符个数&#xff0c;要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {cout << "请输入一…