网站建设模板成功案例,网站收录查询站长工具,软件工程师需要什么学历,wordpress 登录页目录
一、通过图形化方式#xff0c;在界面上创建出一个控件
二、通过代码方式#xff0c;创建Hello World
三、Qt 内存泄漏问题
(一) 对象树 一、通过图形化方式#xff0c;在界面上创建出一个控件
创建项目后#xff0c;打开双击forms文件夹中的ui文件#xff0c;可…目录
一、通过图形化方式在界面上创建出一个控件
二、通过代码方式创建Hello World
三、Qt 内存泄漏问题
(一) 对象树 一、通过图形化方式在界面上创建出一个控件
创建项目后打开双击forms文件夹中的ui文件可以进入到图形化设计ui的界面。 在左侧找到Display Widgets模块将Label拉到 双击这个Label模块。可以进行修改在右下角也可以对这个控件进行修改。 修改之后我们的界面相当于存在了一个Label的控件。
在Qt Designer右上角通过树形结构显示出来当前界面上都有哪些控件。 保存之后查看头文件源文件其实并没有任何变化
当我用文本编辑器打开ui文件的时候会发现多出了一段代码。 在我们运行的时候会自动的根据多出来的几段代码编译出来带有Hello World界面的程序。 二、通过代码方式创建Hello World
一般通过代码来构造界面的时候通常会把构造界面的代码放到Widget的构造函数中。 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);QLabel *label new QLabel(this); // 创建Label对象label-setText(Hello World); // 设置控件中要显示的文本文件
} Qt诞生于1991年当时C还没有形成标准C更没有标准库这样的改变当时如何表示一个字符串可以使用C风格字符串也可以使用C的stringQt为了让自己的开发变得顺畅就自己发明了一套轮子搞了一系列的基础类来支持Qt的开发包括不限于字符串QString动态数组QVector链表QList字典QMap等等。
很多年之后C中的容器等已经打磨的很好了但是Qt自己包装好的这些容器类也不可能删除就只能和现有的标准库中的容器类共存了。 在QString中也提供了C风格字符串作为参数的构造函数不显示构造QString。 运行程序就显示出了Hello World了只不过是在左上角默认的就是在左上角如果想放到其他位置可以通过resize来设置。
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);QLabel *label new QLabel(this); // 创建Label对象label-setText(Hello World); // 设置控件中要显示的文本文件label-resize(230,240);
} 三、Qt 内存泄漏问题
上面的代码中label是new出来的一个对象但是最后却没有使用delete这不会出现内存泄漏问题吗内存泄漏文件描述符泄露等同类问题都是非常严重的。
上述代码并不会产生内存泄漏。label对象会在合适的时候被析构释放(虽然没有手写delete但却是能释放)
之所以能够把对象释放掉主要是因为把这个对象是挂到了对象树上。
(一) 对象树 可以看到这个结构类似于一个树形这里的树上的每一个结点都是一个对象通过这个树形结构就把界面上要显示的这些控件都组织起来了。这里的树上的这些对象统一销毁是最好不过的如果某个对象提前销毁此时就会导致对应的控件就在界面上不存在了。所以前面代码中通过new的方式创建对象也就是为了把这个对象的生命周期交给Qt的对象树统一来进行管理。如果这个对象树是在栈上的变量创建的就可能会存在一些提前释放的问题。
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);// QLabel *label new QLabel(this); // 创建Label对象
// label-setText(Hello World); // 设置控件中要显示的文本文件QLabel label(this);label.setText(hello world);
} 无法显示出来hello world。