"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博客