qt学习笔记
学习背景介绍
互联网核心岗位 职责
1.开发 程序员
客户端:直接和用户打交道的这一端的程序
虽然大部分的客户端程序,是需要背后有服务器进行支撑,同时也有一些程序不需要服务器,比如画图板,计算器等
Qt是特指进行桌面应用开发
客户端开发的重要任务:编写和用户交互的界面
和用户交互界面风格:
1.TUI 命令行/终端界面
2.GUI 图形化界面
Qt的优点:
- 跨平台,几乎支持所有的平台
- 接口简单,容易上手,学习QT框架对学习其他框架有参考意义
- 一定程度上简化了内存回收机制
- 开发效率高,能够快速的构建应用程序
- 有很好的社区氛围,市场份额在缓慢上升。
- 可以进行嵌入式开发
Qt开发环境
1.c++编译器
2.Qt SDK (windows版本Qt SDK内置C++的编译器,内置的编译器是mingw,windows版本的gcc/g++)
3.需要一个Q的集成开发环境
下载sdk
Qt 下载官⽹:http://download.qt.io/archive/qt/
国内清华源: https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/
对象树
1.label 标签
界面上用来显示内容的字符串
- setText方法
//ui编辑 //label“标签”
QLabel *label=new QLabel(this); //给当前label对象指定一个父对象
label->setText("hello world"); //设置控件显示的文本
由于Qt开发了一套基础类,且比较成熟
当我传入的是一个字符串,那么这个字符串可以是原生C++的string 也可以是QString对象
图像结果:
默认是在左上角
对内存泄漏的思考?
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QLabel>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
//ui编辑 //label“标签”
QLabel *label=new QLabel(this); //给当前label对象指定一个父对象
label->setText("hello world"); //设置控件显示的文本
ui->setupUi(this);
}
MyWidget::~MyWidget()
{
delete ui;
}
为什么这里不进行delete new出来的对象,不会造成内存泄漏? label对象会在合适的时候被析构释放(虽然没有手动写delete,确实能释放)
之前能够把对象释放掉,主要是因为把这个对象是挂在了对象树上
使用new的方式创建对象 ,是为了把这个对象的生命周期交给Qt的对象树来进行统一管理。那么如果对象是在栈上进行创建,那么就会出现“提前释放”的问题。
如何将我们创建的类添加到对象树中。
#ifndef MYLABEL_H
#define MYLABEL_H
#include<QLabel>
class mylabel : public QLabel
{
public:
//构造函数使用带QWidget*版本的
//这样才能确保我们的对象能够加到对象树上
mylabel(QWidget *parent);
~mylabel();
};
#endif // MYLABEL_H
快捷键: 按下alt+enter,可以自动生成代码在对应的cpp
文件中添加函数的定义
#include "mylabel.h"
mylabel::mylabel(QWidget * parent) :QLabel(parent)
{
}
我们想看到对象树进行析构的过程
使用mylabel代替QLabel类,对QLabel进行继承,保持了原有QLabel的功能不变
其次给对象拓展出来一个析构函数,通过这个析构函数,打印一个自定义的日志,方便程序运行效果
//mylabel.h
~mylabel();
//mylabel.cpp
mylabel::~mylabel()
{
// std::cout<<"My albel 被销毁了..."<<std::endl;
qDebug()<<"My label 被销毁了...";
}
乱码问题
使用cout出现了乱码问题:
使用qDebug()未出现乱码问题:
思考:在计算机中,一个汉字,占几个字节? 前提条件:当前中文编码使用的是哪种方式(字符集)
计算机存的其实是二进制集合。
表示汉字的字符集:有很多种,不同的字符集表示同一个汉字,使用的数字不相同!!
目前,表示汉字字符集,主要有两种方式:
- GBK(中国大陆) 使用2个字节表示一个汉字,windows默认的字符集为GBK
- UTF-8 变长编码,表示一个符号,使用的字节数有变化,2-4但是在utf-8中,汉字一般是3个字节。
linux中就是UTF-8
出现乱码问题的原因:
主要就是编码的方式不匹配!!! 比如:字符串本身是utf8进行编码,但是终端输出是gbk的方式进行解析显示的,此时就会出现乱码。
当前表示中文,主流的方式,还是utf8,支持各种语言文字
在qt开发中一般用qDebug()去替代cout进行日志打印输出
QLineEdit的使用
实现QLineEdit 输出hello world的三个方法
1.通过UI空间直接拖拽设置文本
2.使用纯代码实现
QLineEdit* edit=new QLineEdit(this);
edit->setText("hello world");
QLineEdit内的文字是可编辑的
3.通过按钮的方式实现
Push Button的使用
在push button中想加入更多的交互功能就要使用Qt中的信号槽机制
初始信号槽机制: 本质就是给按钮的点击操作,关联上一个处理函数,当用户点击的时候,就会执行这个函数的处理函数。实现业务逻辑的处理。
connect函数
connect(ui->pushButton,...)
ui->pushButton 访问form file(UI文件)中创建的控件!!!
在Qt设计师中会给控件分配一个objectName属性。这个属性的值,要求在界面的唯一的。
这里的pushButton就是这个属性的name,同时我们也可以进行手动修改!
void MyWidget::handleClick()
{
//当按钮被点击之后,就把按钮中的文本,进行切换。。。
if(ui->pushButton->text()=="登录")
{
ui->pushButton->setText("qt");
}
else
{
ui->pushButton->setText("c++");
}
}
纯代码实现pushbutton
myButton=new QPushButton(this);
myButton->setText("hello world");
//连接信号和槽
connect(myButton,&QPushButton::clicked,this,&MyWidget::handleClick1);
//槽函数的实现
void MyWidget::handleClick1()
{
if(myButton->text()==QString("hello world"))
{
myButton->setText("hello qt");
}
else
{
myButton->setText("hello c++");
}
}
connect(myButton,&QPushButton::clicked,this,&MyWidget::close);
信号和槽函数的文档探究
点击按钮和关闭的操作,那么如何知道QPushButton中有clicked方法还有close槽函数
通过查找文档: 先搜索:QPushButton
没有找到相关的槽函数,那么就找他的父类,因为可能继承自它的父类的槽函数
再搜索:QAbstractButton
正好在这里就找到了相关的槽函数和信号