前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【Qt】HelloWorld程序

【Qt】HelloWorld程序

作者头像
Yui_
发布2025-02-27 08:44:20
发布2025-02-27 08:44:20
4900
代码可运行
举报
文章被收录于专栏:Yui编程知识Yui编程知识
运行总次数:0
代码可运行

1. 图形化方式

创建完项目后,打开fromfile双击.ui文件进入图形化界面,左侧为可选择的控件,往下划找到Label控件,拖动到中间的界面后输入HelloWorld即可。

image.png
image.png

进入编辑界面看看,可以看到和原来还是不一样的。

image.png
image.png

刚才往界面上拖拽了一个QLabel控件,此时Ui文件的xml中就多出来这么一段代码,然后进一步qmake就会在编译项目的时候,基于这个内容生成一段C++代码,通过这个C++代码构建出界面内容了,这些都是自动生成的。 我们可以打开,ui_widget文件查看,这就是自动生成的C++代码。

image.png
image.png

该段代码在系统产生的临时文件中,如果你不知道在哪里查找可以去看我前面一篇关于Qt的文章:【Qt】初始项目代码解释

2.代码方式

一般通过代码构造界面的时候,通常会把构造界面的代码放到Widget/MainWindow的构造函数中。 打开widget.cpp文件,写下一下代码:

代码语言:javascript
代码运行次数:0
复制
#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
image.png

2.1 代码解释

QLabel* label = new QLabel(this);,学过C++肯定知道这是在堆上创建一个变量,但是呢为什么构造的时候要加this呢?可以不加吗? 现说结论:可以不加this,但是不推荐,这个this的作用是给当前的label对象指定一个父对象,这和后续的对象树有关。 如果你把鼠标悬停在label->setText上,你会看到这样的界面:

image.png
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这可会造成内存泄漏的~

代码语言:javascript
代码运行次数:0
复制
#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,答案是不需要的,真相就在这段代码中

代码语言:javascript
代码运行次数:0
复制
QLabel* label = new QLabel(this);

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

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

代码语言:javascript
代码运行次数:0
复制
#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
image.png

4. 总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.代码方式
    • 2.1 代码解释
  • 3. 关于内存泄漏
  • 4. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档