【Qt】HelloWorld程序

🏠大家好,我是Yui_💬
🍑如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🚀如有不懂,可以随时向我提问,我会全力讲解~
🔥如果感觉博主的文章还不错的话,希望大家关注、点赞、收藏三连支持一下博主哦~!
🔥你们的支持是我创作的动力!
🧸我相信现在的努力的艰辛,都是为以后的美好最好的见证!
🧸人的心态决定姿态!
💬欢迎讨论:如有疑问或见解,欢迎在评论区留言互动。
👍点赞、收藏与分享:如觉得这篇文章对您有帮助,请点赞、收藏并分享!
🚀分享给更多人:欢迎分享给更多对编程感兴趣的朋友,一起学习!


在Qt中,实现HelloWorld的方法有两种:

  • 通过图形化的方式,在界面上创建出一个控件,显示HelloWorld。
  • 通过纯代码的方式,在界面上创建控件,显示HelloWorld。

1. 图形化方式

Qt_helloWorld.gif
创建完项目后,打开fromfile双击.ui文件进入图形化界面,左侧为可选择的控件,往下划找到Label控件,拖动到中间的界面后输入HelloWorld即可。
image.png
进入编辑界面看看,可以看到和原来还是不一样的。
image.png
刚才往界面上拖拽了一个QLabel控件,此时Ui文件的xml中就多出来这么一段代码,然后进一步qmake就会在编译项目的时候,基于这个内容生成一段C++代码,通过这个C++代码构建出界面内容了,这些都是自动生成的。
我们可以打开,ui_widget文件查看,这就是自动生成的C++代码。
image.png
该段代码在系统产生的临时文件中,如果你不知道在哪里查找可以去看我前面一篇关于Qt的文章:【Qt】初始项目代码解释

2.代码方式

一般通过代码构造界面的时候,通常会把构造界面的代码放到Widget/MainWindow的构造函数中。
打开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);
    label->setText("HelloWorld");
}

Widget::~Widget()
{
    delete ui;
}

运行~
image.png

2.1 代码解释

QLabel* label = new QLabel(this);,学过C++肯定知道这是在堆上创建一个变量,但是呢为什么构造的时候要加this呢?可以不加吗?
现说结论:可以不加this,但是不推荐,这个this的作用是给当前的label对象指定一个父对象,这和后续的对象树有关。
如果你把鼠标悬停在label->setText上,你会看到这样的界面:
image.png
Qstring是什么?
我们肯定知道C++中有String,那么这个Qstring是什么呢?
这就不得不追述到Qt诞生的时间,Qt诞生于1991年,那时C++还没有形成标准呢,我们所熟知最早的C++标准也是在1998年形成的C++98。
既然没有标准,那么Qt为了让自己的开发变得更流程,就自己发明了一套轮子。搞了一系列得基础类,在支持Qt得开发。
包括但不限制于:

  • QString 字符串
  • QVector 动态数组
  • QList 链表
  • QMap 字典

    多年以后,C++标准已经形成,但是这些已经引入的Qt自己包装好的容器类,也不可能删除了,自能和现在的标准库容器共存,因此,我们在开发Qt代码的时候,如果需要用到上书容器,可以使用标准库的容器,也可以使用Qt自己创建的容器。

3. 关于内存泄漏

细心的同学可能已经发现了,在这段代码中,我没有delete这可会造成内存泄漏的~

#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);
    label->setText("HelloWorld");
}

Widget::~Widget()
{
    delete ui;
}

作为C/C++代码的编写者,我们需要时刻关注内存泄漏的问题,因为内存泄漏是一件非常可怕的事情,同时还有文件描述符的泄漏。
回到这段代码,到底要不要添加delete,答案是不需要的,真相就在这段代码中

QLabel* label = new QLabel(this);

因为this的存在,我们把这个对象托管到了对象树,由它的父对象来管理。
label对象会在合适的时候自动背析构释放,虽然我们没有手动写delete,但是因为该对象已经挂到了对象树上了。

前端开发也会涉及到类似的对象树(DOM),本质上也是一个树形结构,通过树形结构把界面的各种元素给组织起来。
Qt中也存在类似对象树把各种元素给组织起来。
注意:
如果我们对象改为栈上创建,此时就可以看到运行去了的程序无法显示HelloWorld,此时label对象随着析构函数的结束,就销毁掉了。

#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);
    QLabel label;
//    label->setText("HelloWorld");
    label.setText("HelloWorld");
}

Widget::~Widget()
{
    delete ui;
}


image.png

4. 总结

感谢你的观看,希望本文对你有所帮助~


往期文章:
【Qt】初始项目代码解释

评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yui_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值