【Qt秘籍】[006]-Qt 的 Hello World程序-编程第一步

2024-05-31 18:52

本文主要是介绍【Qt秘籍】[006]-Qt 的 Hello World程序-编程第一步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        "Hello,World!" 中文意思是“你好,世界”。

        因为 The C Programming Language 中使用它做为第一个演示程序,后来很多程序员在学习编程或进行设备调试时延续了这一习惯。

        下面,我们也将演示Qt中的"Hello World!"

        我们先创建一个文件。

        【不知道如何创建的朋友请移步【Qt秘籍】[005]-Qt的首次邂逅-创建】

创建方式

1.图形化方式

2.纯代码方式

图形化方式 

1.打开widget.ui

2.找到Label控件后推拽到右边屏幕上

3.拖动放大,让后修改名字

我们发现,在右上角已经显示出其控件

4.保存后直接运行

         我们发现,不同于我们以前写过的代码,这种方式是自动完成的。Qt Designer提供了拖放式的界面构建方式,让我们可以直观地从组件面板中选择按钮、标签、文本框等各种UI元素,并放置到窗体上。我们可以直接调整这些元素的大小、位置以及样式,从而无需编写布局代码就能创建复杂的用户界面布局。

纯代码方式

同样地,我们也可以直接用纯代码方式创建文件。

请先点击关闭所有项目和编辑器 ,以免造成两次代码混淆。

1.打开widget.cpp

2.添加几行代码

QLabel* label = new QLabel(this);   //使用this的原因: 给当前label指定一个“父对象”
label->setText("hello world!");     //代码创建后默认显示在左上角

3.添加头文件

#include <QLabel>

widget.cpp 所有代码展示 

//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QLabel* label = new QLabel(this);   //使用this的原因: 给当前label指定一个“父对象”label->setText("hello world!");     //代码创建后默认显示在左上角
}Widget::~Widget()
{delete ui;
}

4.保存后运行

 

我们发现,"hello world!"确实显示在了左上角。

 

问题1:内存泄漏

为何new对象后没有delete呢?难道不会造成内存泄漏吗?

回答1:内存泄漏

        在Qt中,是否需要手动调用delete来释放由new创建的对象,取决于该对象是否被Qt的对象树管理系统所管理。

        当在Qt中创建一个对象并为其指定了父对象时(通常是在构造函数中传入父对象的指针作为参数),该对象会自动加入到其父对象的子对象列表中。在这种情况下,当父对象被销毁时(例如,父对象是一个窗口部件并且窗口关闭),Qt的事件处理机制会自动遍历并销毁所有子对象,从而释放它们占用的内存。因此,在这种场景下,你不需要手动调用delete,Qt框架会帮你管理这部分内存,避免内存泄漏。

        然而,如果你使用new创建了一个对象但没有指定父对象,或者该对象没有以任何方式连接到Qt的对象树上,那么你就有责任显式地调用delete来释放该对象占用的内存。如果不这样做,确实会导致内存泄漏,即该块内存将无法被再次使用,直到程序结束。

总的来说,为了避免内存泄漏:

  • 对于加入到Qt对象树中的对象(有父对象的),通常不需要手动delete
  • 对于没有父对象或者未加入对象树的动态分配对象,需要确保适时地手动调用delete

        在实践中,尽量利用Qt的对象树机制来管理内存,减少手动内存管理的需求,这样可以降低内存泄漏的风险。同时,现代C++实践鼓励使用智能指针(如std::unique_ptr, std::shared_ptr)来自动管理内存,即使在非Qt环境中也是如此。

对象树

【Qt知识】Qt中的对象树是什么?-CSDN博客

这篇关于【Qt秘籍】[006]-Qt 的 Hello World程序-编程第一步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1018757

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程