对象树
1.QLabel* label = new QLabal(this)
这个代码在new了之后没有释放,不会造成内存泄漏。
原因是这个对象是挂到了对象树上。
qt就是设计了一个n叉树,将各种元素组织起来了。
例如以下图
通过树形结构,就把界面上显示的这些控件对象都组织起来了。
使用对象树,把这些内容组织起来,在窗口关闭的时候释放。
所以,通过new的方式创建对象,也就是把这个对象的生命周期,交给Qt的对象树来统一管理。
假如在栈上创建的话,生命周期会随着构造函数的结束,就释放掉。
将对象挂到对象树上
构造函数需要有QWidget* parent,将parent赋值给label对象。这样才能label对象挂到对象树上。
如何解决qt中的乱码问题
1.不要使用cout输出,使用QDebug()工具
使用QDebug()可以很好地处理字符编码,达到预期的效果。
QDbug是Qt中的类,但是又不会直接使用类。
使用qDebug()这个东西,他封装了QDebug()对象,直接使用qDebug()就行,相当于使用cout。
但是Linux使用Qt Creator一般都没事,可以使用cout。因为Linux的编码一般都是utf8.
qDebug()的好处就是可以统一进行关闭,如果这个程序是要发布给用户的,可以通过编译开关,一键关闭。
小结
1.简单认识QLabel类,能够在界面上显示字符串。
通过setText来设置的,参数QString(Qt中把C++里的很多容器类,进行了重新封装)
2.内存泄漏和文件泄漏
3.对象树,qt推荐使用new的方式在堆上创建对象,通过对象树,统一释放对象,
创建对象的时候,在构造函数中,指定父对象,此时才能挂到对象树上。
4.通过Qt内置的类,就可以达到对现有控件进行功能扩展效果。
Qt的内置的QLabel,没法看到销毁过程,为了看清楚,就创建类MyLabel,继承自QLabel重写析构函数。就可以观察到对象的释放过程了。
也可以重写控件中的任何功能,不仅仅是析构函数,达到功能扩展目的。
# 基于图形化按钮输出hello word
信号和槽
connect()
这是QObject提供的静态函数,用来连接信号和槽。
connect(ui->pushButton, &QPushButton::clicked, this, &Widget::handleClick);
//谁发出的信号, 发出的什么信号, 谁来处理这个信号, 信号怎么处理
void Widget::handleClick()
{
//当按钮被点击之后,就把按钮中的文本更换
if(ui->pushButton->text() == QString("hello"))
{
ui->pushButton->setText("hello qt");
}
else
{
ui->pushButton->setText("hello");
}
}
基于代码实现信号和槽
对于纯代码版本的,按钮对象是咱们自己new的,为了保证其他函数中能够访问到这个变量,就需要把按钮对象添加到widget的成员变量中。
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void handleClick();
private:
Ui::Widget *ui;
//添加成员变量
QPushButton* myButton = new QPushButton(this);
};
而图形化操作,不需要new,new对象的操作,已经被Qt自动生成了
已经作为ui对象的一个成员变量了。也无需作为Widget的成员
实际开发中,这两种方法都会使用。
假如当前程序界面,界面内容比较固定,就会以图形化的1方式来构造界面。
但是你的程序界面要经常动态变化,就会以代码的方式来构造界面,
这两种方法还可以配合使用,不冲突。
Qt的命名规范
1.起名要有描述性
2.如果名字比较长,由多个单词构成,需要用适当的方式进行分词。
以下划线分割的叫做蛇形命名法。比如student_count.
Qt喜欢使用驼峰命名法。
比如:studentCount, QApplication。
首字母小写的叫做小驼峰。给变量、函数使用的话用小驼峰。
首字母大写的叫做大驼峰。给类使用的话是大驼峰。
Qt的快捷键
同名之间的.h和.hpp的切换:F4
生成函数声明的对应定义:alt+enter
查询文档:F1
Qt窗口坐标体系
坐标体系:以左上角为准,横轴是x轴,竖轴是y轴,但是这个y轴是朝下的。
计算机中的坐标系叫做左手坐标系。
坐标系原点(0,0)是屏幕的左上角,或者窗口的左上角
但是坐标系原点是相对于父窗口控件的。
button->move(200, 300); move函数就是移动按钮的位置的
坐标背后的单位:像素、
显示器的本质就是一大堆小灯泡小亮点构成的。
。
计算机中的坐标系叫做左手坐标系。
坐标系原点(0,0)是屏幕的左上角,或者窗口的左上角
但是坐标系原点是相对于父窗口控件的。
button->move(200, 300); move函数就是移动按钮的位置的
坐标背后的单位:像素、
显示器的本质就是一大堆小灯泡小亮点构成的。