【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.rhkb.cn/news/339129.html

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

相关文章

【Docker】学习笔记(超万字图文整理)

前言 再此感谢黑马程序员提供的Docker课程! 什么是Docker?看这一篇干货文章就够了! UPD: 补充更新微服务集群、Docker镜像仓库部分内容 所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验(无广告且清爽)&#…

centos7下安装MySQL,Oracle数据库

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 操作系统版本为CentOS 7 使⽤ MySQ…

【Ambari】Docker 安装Ambari 大数据单机版本

目录 一、前期准备 1.1 部署 docker 1.2 部署 docker-compose 1.3 版本说明 二 、镜像构建启动 2.1 系统镜像构建 2.2 安装包源镜像构建 2.3 kdc镜像构建 2.4 集群安装 2.5 容器导出为镜像 三、Ubuntu环境安装测试 3.1 环境准备 3.2 集群容器启动 一、前期准备 1.…

【算法】理解堆排序

堆排序,无疑与堆这种数据结构有关。在了解堆排序之前,我们需要先了解堆的建立与维护方法。 堆 堆(二插堆)可以用一种近似的完全二叉树来表示,该二叉树除了叶子结点之外,其余节点均具有两个子女&#xff0c…

模板-初阶

引言: 在C,我们已经学过了函数重载,这使得同名函数具有多个功能。但是还有一种更省力的方法:采用模板。 本文主要介绍以下内容 1. 泛型编程 2. 函数模板 3. 类模板 1.泛型编程 在将这一部分之前,通过一个故事引…

nginx的配置粗记

小白nginx的配置随笔(随便记记) 前言 我们都知道nginx有很多用途,比如:负载均衡,反向代理,网关路由,解决跨域等问题。我这次开发项目,用到的一些功能也涉及到了对nginx的配置&#…

Vue.js 动态组件与异步组件

title: Vue.js 动态组件与异步组件 date: 2024/6/2 下午9:08:50 updated: 2024/6/2 下午9:08:50 categories: 前端开发 tags:Vue概览动态组件异步加载性能提升路由管理状态控制工具生态 第1章 Vue.js 简介 1.1 Vue.js 概述 Vue.js 是一个渐进式的JavaScript框架,…

MedSAM 学习笔记(续):训练自定义数据集

1、下载官方权重 官方的预训练权重:https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth 下载后保存在:work_dir/SAM/sam_vit_b_01ec64.pth 目录 2、摆放数据集 因为MedSAM 分割模型需要对3D数据集进行切片处理,也就是对nii.gz 数据处理成 npy 格式 …

Linux--构建进程池

目录 1.进程池 1.1.我们先完成第一步,创建子进程和信道 1.2. 通过channel控制,发送任务 1.3回收管道和子进程 1.4进行测试 1.5完整代码 1.进程池 进程池其产生原因主要是为了优化大量任务需要多进程完成时频繁创建和删除进程所带来的资源消耗&#…

Mysql(一)查询Sql是如何执行的

Hello,大家好我是极客涛😎,我最近在整理Mysql相关的知识点,所以准备开启一个Mysql的主线任务,大概耗时3周左右,整个节奏还是由浅入深,主要包括Mysql的架构、事务实现、索引组织形式、SQL优化、日…

图解大模型分布式并行各种通信原语

背景 在分布式集群上执行大模型任务时候,往往使用到数据并行,流水线并行,张量并行等技术,这些技术本质上也就是对数据进行各种方案的切分,然后放到不同的节点上运算。不同节点在计算的过程中需要对数据分发或者同步等…

python的一种集成开发工具:PyCharm开发工具

一. 简介 本文简单了解两种 python语言所使用的 集成开发环境: PyCharm、vscode。 python语言学习中,可以任意选中这两个集成开发环境的一种就可以。本文先来简单学习 PyCharm开发工具安装与使用。 二. python的一种集成开发工具:PyChar…

实现Redis和数据库数据同步问题(JAVA代码实现)

这里我用到了Redis当中的发布订阅模式实现(JAVA代码实现) 先看图示 下面为代码实现 首先将RedisMessageListenerContainer交给Spring管理. Configuration public class redisConfig {AutowiredRedisConnectionFactory redisConnectionFactory;AutowiredQualifier("car…

Linux线程:线程分离

目录 一、什么是线程分离 1.1pthread_detach 1.2pthread线程库存在的意义 1.3__thread线程的局部存储 1.4系统调用clone 一、什么是线程分离 1.1pthread_detach 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_joi…

数据标准的制定落地

目录 什么是数据标准 基本定义 目的 数据标准体系分类 从内容层面分类 从管理视角分类 从面向的对象分类 从数据结构的角度分类 数据标准价值 业务价值 技术价值 管理价值 数据标准和数据治理的关系 数据标准在数据治理各项任务中的作用 数据标准与主数据 数据…

车联网安全入门——ICSim模拟器使用

文章目录 车联网安全入门——ISCim模拟器使用介绍主要特点:使用场景: 安装使用捕获can流量candumpcansnifferwiresharkSavvyCAN主要特点:使用场景: 重放can报文cansendSavvyCAN 总结 车联网安全入门——ISCim模拟器使用 &#x1…

LabVIEW步进电机的串口控制方法与实现

本文介绍了在LabVIEW环境中通过串口控制步进电机的方法,涵盖了基本的串口通信原理、硬件连接步骤、LabVIEW编程实现以及注意事项。通过这些方法,用户可以实现对步进电机的精确控制,适用于各种自动化和运动控制应用场景。 步进电机与串口通信…

【刷题(15】普通数组

一 普通数组基础 首先&#xff0c;我们根据下图先了解一下什么是前缀和。 既然我们明白了前缀和是怎么回事&#xff0c;那我们就来看一下我们该怎么输入 先给出答案&#xff0c;然后再给出分析。 答案&#xff1a; for (int i 1; i < n; i ){cin >> a[i];s[i] s…

Pytest框架中用例用例执行常用参数介绍

pytest 支持通过命令行参数来定制测试运行的方式。以下是一些常用的 pytest 执行参数介绍。 学习目录 -q 或 --quiet: 安静模式&#xff0c;只显示进度和摘要 -s : 选项允许在测试的输出中捕获 stdout 和 stderr。 -v : 选项会使 pytest 的输出更加详细。 -k &#xff1a;…

DIYP对接骆驼后台IPTV管理,退出菜单中显示用户名已经网络信息,MAC,剩余天数,套餐名称等

演示&#xff1a;https://url03.ctfile.com/f/1779803-1042599473-4dc000?p8976 (访问密码: 8976) 后台加上EPG&#xff0c;增加一些播放源的动态端口替换。 前台app上&#xff0c;退出菜单中显示用户名已经网络信息&#xff0c;MAC&#xff0c;剩余天数&#xff0c;套餐名称…