1. 图形化方式
创建完项目后,打开fromfile
双击.ui
文件进入图形化界面,左侧为可选择的控件,往下划找到Label
控件,拖动到中间的界面后输入HelloWorld
即可。
进入编辑界面看看,可以看到和原来还是不一样的。
刚才往界面上拖拽了一个QLabel
控件,此时Ui文件的xml中就多出来这么一段代码,然后进一步qmake就会在编译项目的时候,基于这个内容生成一段C++代码,通过这个C++代码构建出界面内容了,这些都是自动生成的。
我们可以打开,ui_widget
文件查看,这就是自动生成的C++代码。
该段代码在系统产生的临时文件中,如果你不知道在哪里查找可以去看我前面一篇关于Qt的文章:【Qt】初始项目代码解释
一般通过代码构造界面的时候,通常会把构造界面的代码放到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;
}
运行~
QLabel* label = new QLabel(this);
,学过C++肯定知道这是在堆上创建一个变量,但是呢为什么构造的时候要加this
呢?可以不加吗?
现说结论:可以不加this,但是不推荐,这个this的作用是给当前的label对象指定一个父对象,这和后续的对象树有关。
如果你把鼠标悬停在label->setText
上,你会看到这样的界面:
Qstring
是什么?
我们肯定知道C++中有String,那么这个Qstring是什么呢?
这就不得不追述到Qt诞生的时间,Qt诞生于1991年,那时C++还没有形成标准呢,我们所熟知最早的C++标准也是在1998年形成的C++98。
既然没有标准,那么Qt为了让自己的开发变得更流程,就自己发明了一套轮子。搞了一系列得基础类,在支持Qt得开发。
包括但不限制于:
细心的同学可能已经发现了,在这段代码中,我没有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;
}
感谢你的观看,希望本文对你有所帮助~