前言
如何在QT中进行hello world字符串的显示?
`
一、图形化的方式
图形化方式界面上创建出一个控件QLable,显示hello world
-
双击打开widget.ui,跳转到设计页面
-
左侧Display Widgets的控件,添加Label,双击修改相关内容
-
通过控件形成了label,上图显示了当前界面有哪些控件,
-
刚才的拖拽后,ui文件的xml中就会多出来一段代码,qmake也会在编译中基于这个内容生成一段代码,再通过代码构建这个界面。
这时通过右键左侧empty,pro,在Exprorer中显示 ,就会打开一个文件夹,上一级的build目录,其中的ui_widget.h中就可以在代码中看到我们创建的label.
lass Ui_Widget
{
public:
QLabel *label;
void setupUi(QWidget *Widget)
{
if (Widget->objectName().isEmpty())
Widget->setObjectName(QString::fromUtf8("Widget"));
Widget->resize(434, 288);
# 创建标签过程
label = new QLabel(Widget);
label->setObjectName(QString::fromUtf8("label"));
label->setGeometry(QRect(230, 30, 151, 51));
retranslateUi(Widget);
QMetaObject::connectSlotsByName(Widget);
} // setupUi
二、代码方式
QT Creater中,通过代码来构造界面的时候,通常把构造界面的代码放入Widget的构造函数中(Widget.cpp)(根据之前创建文件的选择),以下是完整代码
#include <QLabel>//(一定要添加才可以使用)
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QLabel* label = new QLabel(this);//直接添加不可以
//this指的是给当前label对象指定父对象,this就是当前的构造函数锁定的对象,也就是main函数中的Widget.
//QLabel label
label ->setText(“hello world");
}
新建label对象
QLabel* label = new QLabel(this);//直接添加不可以
直接添加label类会显示找不到头文件,因为每一个类都有对应的同名头文件.
之前QT用的头文件是 <qlabel.h>,现在通常使用<QLabel ,该风格代替了原有的。
添加头文件后就可以正常使用label了
Label标签是一个显示内容的字符串控件,起到说明效果,目的是完成文字的显示,在堆上和栈上创建都可以,推荐以上在堆创建的方式。
设置文本
C++没有形成标准库的时候,表示字符串就有很多种方式,字符串c风格(\0)和C++风格(string),这两种都不好用,因此QT中增加了轮子,一系列基础类支持开发,比如QString,链表QList,字典QMap,很多年以后形成了标准,已经引入的容器类也不会删除,只能和标准库容器类共存,用哪一个都可以,原生Api中用的是QT自己这一套。
后续的代码中,看到的更多是QString,而不是std::string,两者之间可以很方便的互相转换,QString很好用,已经对字符编码做了处理
label ->setText(“hello world");
在QString中,也提供了c风格字符串作为参数的构造函数,上述代码中也会隐式构造成QString对象
QSTring对应的头文件,已经被很多Qt内置的其他类间接包含了,因此一般不需要显式包含QString
显示结果
如下图所示,用代码方式,默认显示在了左上角
如果想放到其他位置也可以。
三、内存泄漏问题的讨论
上述代码中,new了之后没有delete
内存泄漏是一个非常严重的问题, 文件描述符泄漏都很严重,不容易第一时间发现,但是资源泄露的很多,就崩了。真正生产中会只上线一台机器,"灰度上线"避免很大的影响。
但是上述代码不会发生内存泄漏,label对象会在合适的时候析构释放,因为我们将它挂在了对象树上了,具体对象树的介绍放在下一篇文章中讲解。
总结
以上是用代码方式和图形化界面的方式在widget上显示helloworld。