1、Qt Hello World 程序
1.1 使用标签实现
1.1.1 使用可视化方式实现
双击点开widget.ui
将Label拖拽到面板上,之后就出现了文本框,就可以将要写的内容写进文本框
1.1.2 纯代码方式实现
通常将构造界面的代码放到构造函数当中Widget/MianWindow的构造函数当中。
#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);//最好加上this
//QLabel Label;
label->setText("hello world");//这里使用Qstring("")也是可以的,上面是进行了隐式转换
//显示文本
}
Widget::~Widget()
{
delete ui;
}
1.2 使用编辑框来完成hello world
在这里简单的介绍一下标签和文本框的区别
LineEdit用于接受用户的输入并允许用户编辑,而Label则用于静态文本或图像的显示,不能接受用户的输入。
1.2.1 使用可视化的方式来完成hello world
这里还是和上面一样双击widget.ui
也是可以直接通过属性设置窗口通过修改text来改变编辑框的内容。
1.2.2 纯代码的方式实现
#include "widget.h"
#include "ui_widget.h"
#include<QLineEdit>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QLineEdit* qlineedit=new QLineEdit(this);
qlineedit->setText("hello world");
}
Widget::~Widget()
{
delete ui;
}
1.3 通过按钮的方式来实现hello world
1.3.1 通过可视化的方式实现
上面的按钮并没有connect所以,按下去并没有任何反应。
而给我们带来反应的就是信号槽机制,本质就是给按钮的点击操作,关联上一个函数。当用户点击时,就会去执行这个函数。
connect(ui->pushButton,&QPushButton::clicked,this,&widget::handleClick);
通过ui->pushButton获取界面上的按钮,为什么能选中他的原因就是它有自己的属性
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClick);
}
Widget::~Widget()
{
delete ui;
}
void Widget::handleClick()
{
if(ui->pushButton->text()==QString("hello world"))
{
ui->pushButton->setText("hello qt");
} else {
ui->pushButton->setText("hello world");
}
}
1.3.2 使用纯代码的方式形成按钮
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
mybutton=new QPushButton(this);
mybutton->setText("hello world");
connect(mybutton,&QPushButton::clicked,this,&Widget::handleClick);
}
Widget::~Widget()
{
delete ui;
}
void Widget::handleClick()
{
if(mybutton->text()==QString("hello world"))
{
mybutton->setText("hello qt");
} else {
mybutton->setText("hello world");
}
}
//widget.hpp
#ifndef WIDGET_H
#define WIDGET_H
#include<QPushButton>
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void handleClick();
private:
Ui::Widget *ui;
QPushButton* mybutton;
};
#endif // WIDGET_H
纯代码版本的按钮对象是我们自己new出来的,并在创建按钮时,发现是局部变量,在handleClick当中并没法用,所以在widget类当中加上一个成员变量。
在通过图形化界面按钮是被Qt自动生成的并且作为ui对象当中的一个成员了,无需在做Widget的成员变量。
label创建堆(内存泄漏)或者栈问题
上面代码当中创建在堆上,但是为什么没有释放空间,而不会造成内存泄漏,原因是label对象会在合适的时候进行析构释放,虽然没有手动释放但是的确是释放了。
当中涉及到了对象树(DOM),本质上就是一个树形结构(N叉树),通过树形结构把界面上的各种元素组织起来。
使用对象树,把内容组织起来,最主要的目的就是为了在合适的时机(窗口关闭时)把这些对象统一进行进行释放。
所以此处使用堆来创建对象也是有原因的,就是为了把对象的生命周期交给Qt的对象树统一处理。
如果要是换成在栈上创建就可能存在"提前释放"的问题。
从上面的图片可以看出他的窗口上并没有显示字符串,原因是在它随着构造函数的结束就进行了销毁。
this: QLabel* label=new QLabel(this);指向当前类的对象。在这种情况下,new QLabel(this) 表示创建一个新的 QLabel 对象,并将当前对象作为父对象传递给 QLabel 构造函数。这样做的目的是将 QLabel 设置为当前对象的子对象,从而使 QLabel 跟随当前对象的生命周期。当当前对象被销毁时,与之相关联的 QLabel 也会被销毁,从而方便进行内存管理。
在这里要证明一下,析构函数是能帮我们自动销毁的,
//mylabel.hpp
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QWidget>
#include<QLabel>
class Mylabel : public QLabel
{
Q_OBJECT
public:
//加上QWidget* parent,才能确保自己的对象加在了对象树上
Mylabel(QWidget* parent);
~Mylabel();
};
#endif // MYLABEL_H
//mylabel.cpp
#include "mylabel.h"
#include<iostream>
#include<QDebug>
Mylabel::Mylabel(QWidget* parent):QLabel(parent)
{
}
Mylabel::~Mylabel()
{
qDebug()<<"MyLabel 被销毁";
}
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mylabel.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
Mylabel* label=new Mylabel(this);
label->setText("hello world");
}
Widget::~Widget()
{
delete ui;
}
Qt基础类(Qstring、Qvector、Qlist)
Qt有他自己的一套轮子,但是也可以使用c++当中的类,更建议使用它自己造的轮子,Qstring对于字符编码进行了处理,而std::string就是什么都没干。
乱码问题
在Qt当中使用中文会出现乱码的问题
先简单的了解一下标识汉字的字符集,常用的就两个
GBK(中国大陆)使用两个字节表示一个汉字,windows简体中文版就是GBK字符集
UFT-8/uft8 变长编码,表示一个符号,使用的字节数有变化2-4,在uft8当中,一个汉字一般是三个字节。Linux当中默认的就是uft8
出现乱码的问题就是编码方式不匹配
所以Qt当中有Qstring,可以帮助我们自动的处理编码模式。
Qt当中还提供了一个工具就是qDebug,可以很好的帮助我们打印日志,更好的处理字符编码
qDebug()当中封装了QDebug这个对象,qDebug()他是一个宏,就可以把它当作cout使用,并且他还是自动换行。打印日志是可以统一关闭的。
虽然也可以使用cout,但是cout对于编码的处理
零散知识
在Qt当中可以使用F4进行切换互相对应的头文件和.cpp文件,
在vim当中使用:A进行切换
在Qt当中在声明文件当中使用Alt+Enter会在定义得文件当中自动出现他的框架