【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

相关文章

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

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

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