【Qt】初识

一、使用Label显示Hello World

1.ui设计

可以在Qt Designer中拖拽方式进行创建

2.代码方式

在myqwidget.cpp文件中添加下列代码

二、对象树

我们在堆上创建了QLabel类的对象。但是我们没有去delete,这样会产生内存泄漏吗? 

答案是不会。label对象会在合适的时候(窗口被关闭或者被销毁)被析构释放(虽然没有手动写delete,但确实能释放)

为什么?

原因在于这个this。之所以能够把对象释放掉,主要是因为把这个对象挂在了对象树上。

前端开发(网页开发)也涉及到 类似的 对象树(DOM),本质也是一个树形结构(N叉树),通过树形结构把页面上的各种元素组织起来

Qt中也是类似,也是搞了一个对象树,N叉树,把界面上的各种元素组织起来了。

所以此处用new的方式创建对象,也就是把这个对象的生命周期交给Qt的对象树统一管理

当把对象改成在栈上创建,此时就可以看到,运行起来的程序就无法显示出我们所创建的label对象,此时label对象随着析构函数的结束,就销毁了。

模拟实现Qt自动释放对象机制

创建一个自定义的类,最主要的目的,是自定义一个析构函数,在析构函数中,完成打印,方便咱们看到最终的自动销毁对象树的效果

这是创建的MyQLabel类的头文件

小技巧:

1.在Qt Creator中,可以通过 F4 切换头文件和对应的 .cpp文件。

这是C++ IDE的常规功能

(比如在 Vim 中可以通过 :A 的方式来完成切换,也可以使用 :AT 的方式新开一个标签页来显示)

2.在点击成员函数上,按Alt+回车,再按回车,会自动生产.cpp文件中成员函数实现。

在mywidget.cpp文件中定义对象,并传this。

使用自己定义的MyQLabel代替原来的QLabel,所谓的 “继承” 本质上是拓展,保持原有功能不变的基础上,给对象扩展出一个析构函数,通过这个析构函数,打印一个自定义的日志,方便我们观察程序运行效果。

在myqlabel.cpp文件中,我们在析构函数中打印一条日志消息,

来让我们看看效果,注意:此时输出什么也没有

当我们关闭这个对话框时

就会出现一条消息。但是这个消息是乱码的。

但是日志消息是有的,说明析构函数是执行了。

虽然没有手动delete,但是由于把MyQLabel挂到了对象树上,此时窗口被销毁的时候,就会自动销毁对象树中的所有对象,MyQLabel的析构是执行到了。 

而乱码这个事情,我们以后会经常涉及到,乱码问题出现的原因,有且仅有一个(不局限于C++),就是编码方式不匹配。

目前,表示汉字字符集,主要是两种方式

  1. GBK,(中国大陆)使用2个这字节表示一个汉字,Windows简体中文版,默认的字符集就是GBK
  2. UTF-8/ utf8 变长编码,表示一个符号使用的字节数有变化,2-4,但是在utf8中,一个汉字。一般是3个字节。Linux默认就是utf8

如果你字符集本身是utf8编码的,但是终端(控制台)是按照gbk方式来解析显示的,此时就会出现乱码(拿着utf8的数值,去查询gbk的码表),此时就会出现乱码了!

那么如何查看当前文件是如何编码的呢?

先找到当前文件所处路径的文件夹,用记事本打开,就可以查看了。

如果显示的是UTF-8,就说明这个文件是用utf8进行编码的

如果显示的是ANSI,就说明这个文件是用GBK方式进行编码的。

而我们这个Qt 终端控制台的编码方式没有查询到。

所以Qt提供了一个函数,专门来打印消息qDebug().需要一个头文件,QDebug自动换行

qDebug是一个宏,封装了QDebug类的对象。

qDebug打印的调试日志,是可以统一进行关闭的。

三、使用Line Edit方式显示Hello World

可以通过Qt Designer中拖拽控件进行添加

代码方式 

 

四、通过按钮方式显示Hello World

ui中,Push Button就是一个普通按钮,如果想用,就可以使用拖拽

在Qt Designer中创建一个控件的时候,此时就会给这个控件分配一个objectName属性。

这个属性的值,要求是在界面中是唯一的(不能和别的控件重复)

qmake在预处理.ui文件的时候,就会根据这里的objectName生产对应的C++代码

C++代码中该QPushbutton对象的变量名字就是这里的objectName。这个变量就是ui属性的成员变量。

 纯代码方式:

在mywidget.h文件中定义成员变量MyButton 和 成员函数 Headler,在.cpp中实现

五、Qt窗口坐标系

坐标体系:以左上角为原点(0,0),X向右增加,Y向下增加。

 

move函数,用于调正控件的位置

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

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

相关文章

ChatGPT的基本原理是什么?又该如何提高其准确性?

在深入探索如何提升ChatGPT的准确性之前,让我们先来了解一下它的工作原理吧。ChatGPT是一种基于深度学习的自然语言生成模型,它通过预训练和微调两个关键步骤来学习和理解自然语言。 在预训练阶段,ChatGPT会接触到大规模的文本数据集&#x…

输入输出(1)——C++的输入输出概述

目录 一、C的输入输出 (一) C的输入输出 (二)C语言的scanf和printf 二、C的输入输出流 (一) iostream类库中有关的类 (二) iostream.h头文件的流对象和重载运算符 一、C的输入输出 (一) C的输入输出 之前用到的输入输出,都是以终端…

在做题中学习(62):矩阵区域和

1314. 矩阵区域和 - 力扣(LeetCode) 解法:二维前缀和 思路:读题画图才能理解意思:dun点点的是mat中的一个数,而要求的answer同位置的数 以点为中心上下左右延长 k 个单位所围成长方形的和。 因为最后answ…

IPV4地址介绍

4.1IP地址简介 目前的全球因特网所采用的协议族是TCP/IP协议族。IP是TCP/IP协议族中网络层的协议,是TCP/IP协议族的核心协议。IP协议定义了一种地址编码,称为IP地址,它是网络中网络段、网络设备接口、主机的编码,它并不是一种物理…

Linux离线一键安装Docker及docker-compose环境

背景: 在当前软件部署运维环境中由于Docker容器化优势越来越明显,因些被许多公司运维所采用,那首先如何快速安装Docker及docker-compose基础环境就第一时间被人们关注,本人同样在经过多次手工逐条用命令安装的过程,整理…

基于51单片机的温湿度控制系统

一.硬件方案 本设计采用51单片机每2秒钟从DHT11温湿度传感器中读入温度和湿度,在液晶屏上即时显示。液晶屏上同时显示温湿度上限值,该上限值保存外外部EEPROM存储器中,掉电不失,并且可以通过四只按键上调或下调。当温度或湿度值超…

[猫头虎分享21天微信小程序基础入门教程]第21天:小程序的社交分享与消息推送

[猫头虎分享21天微信小程序基础入门教程]第21天:小程序的社交分享与消息推送 第21天:小程序的社交分享与消息推送 📲 自我介绍 大家好,我是猫头虎,一名全栈软件工程师。今天我们继续微信小程序的学习,重…

MQ第②讲~保证消息可靠性

前言 上一讲我们讲了MQ实际工作中常见的应用场景,这一节讲一下消息的可靠性,如果对MQ掌握程度比较高的铁子,可以不用看,节省您宝贵的时间。 消息的大致链路 消息从投递到消费需要考虑如下几个问题 生产者的消息是否成功投递到消…

虚拟机改IP地址

使用场景:当你从另一台电脑复制一个VMware虚拟机过来,就是遇到一个问题,虚拟的IP地址不一样(比如,一个是192.168.1.3,另一个是192.168.2.4,由于‘1’和‘2’不同,不是同一网段&#…

浅谈路由器转发数据包

当路由器转发数据包时,它会经历一系列步骤,包括接收数据包、路由表查询、以及转发数据包。以下是详细的步骤描述: 1. 接收数据包 以太网帧到达端口:当一个以太网帧到达路由器的某个网络接口(端口)时&#…

20240529瑞芯微官方Toybrick TB-RK3588开发板的Debian11下使用SCP拷贝文件

20240529瑞芯微官方Toybrick TB-RK3588开发板的Debian11下使用SCP拷贝文件 2024/5/29 20:48 1、ADB链接异常。 2、BT打开之后找不到设备? 不清楚:是我拿到的开发板的问题,还是Toybrick/Rockchip官方没有做好。 3、现在最新版本的WINSCP&…

154.找出出现至少三次的最长特殊字符串|(力扣)

代码解决 class Solution { public:int maximumLength(string s) {// 使用unordered_map来存储每个连续子串出现的次数unordered_map<string, int> mp;string key; // 存储当前的连续子串int ans -1; // 存储最终的答案&#xff0c;如果没有符合条件的子串&#xff0c…

高级数据结构-并查集

例题1&#xff1a; Alice和Bob玩了一个古老的游戏&#xff1a;首先画一个 &#x1d45b;&#x1d45b; 的点阵&#xff08;下图 n3 &#xff09;。 接着&#xff0c;他们两个轮流在相邻的点之间画上红边和蓝边&#xff1a; 直到围成一个封闭的圈&#xff08;面积不必为 1&#…

如何更改SSH服务器端口以减少蛮力攻击

本周有一个客户&#xff0c;购买Hostease的独立服务器&#xff0c;询问我们的在线客服&#xff0c;如何更改SSH服务器端口以减少蛮力攻击&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对…

8086 汇编笔记(二):寄存器(内存访问)

一、内存中字的存储 字单元的概念&#xff1a;字单元&#xff0c;即存放一个字型数据(16 位)的内存单元&#xff0c;由两个地址连续的内存单元组成 由上一章学习可知&#xff1a;高地址内存单元中存放字型数据的高位字节&#xff0c;低地址内存单元中存放字型数据的低位字节 …

扎气球最高分-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第74讲。 扎气球最高分&…

Spring框架温习

Spring Spring是一个全面的、企业应用开发一站式的解决方案&#xff0c;贯穿表现层、业务层、持久层。但是 Spring仍然可以和其他的框架无缝整合。 Spring 特点&#xff1a; 轻量级、控制反转、面向切面、容器、框架集合 Spring 核心组件&#xff1a; Spring 常用模块&…

【Redis】 关于 Redis 有序集合类型

文章目录 &#x1f343;前言&#x1f334;普通命令介绍&#x1f6a9;zadd&#x1f6a9;zcard&#x1f6a9;zcount&#x1f6a9;zrange&#x1f6a9;zrevrange&#x1f6a9;zrangebyscore&#x1f6a9;zpopmax&#x1f6a9;zpopmin&#x1f6a9;zrank&#x1f6a9;zrevrank&…

Shell脚本的分支语句,循环语句

分支语句 if 表达式 then 命令表 fi 如果表达式为真&#xff0c;则执行命令表中的命令&#xff0c;否则退出。执行fi后的语句。 给文件权限:chmod 0777 文件名 输出: ./文件名 grep 查找用户名&#xff0c;管道wc -l 统计字符 2.多路分支语句 记得给文件名权限喔&#x…

OSPF扩展知识2

FA-转发地址 正常 OSPF 区域收到的 5 类 LSA 不存在 FA 值&#xff1b; 产生 FA 的条件: 1、5类LSA ----假设 R2为 ASBR&#xff0c;90/0 口工作的 OSPF 中&#xff0c;g0/1 口工作在非 ospf 协议或不同 ospf 进程中&#xff1b;若 g0/1 也同时宣告在和 g0/0 相同的 OSPF 进程…