【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

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2