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/

Qt开发:初识Qt开发框架_#include

Qt开发:初识Qt开发框架_字符串_02

对象树

1.label 标签

界面上用来显示内容的字符串

  • setText方法
//ui编辑    //label“标签”
    QLabel *label=new QLabel(this);   //给当前label对象指定一个父对象
    label->setText("hello world");    //设置控件显示的文本

由于Qt开发了一套基础类,且比较成熟

Qt开发:初识Qt开发框架_Qt_03

当我传入的是一个字符串,那么这个字符串可以是原生C++的string 也可以是QString对象

Qt开发:初识Qt开发框架_Qt_04


图像结果:

Qt开发:初识Qt开发框架_Qt_05

默认是在左上角

对内存泄漏的思考?

#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,确实能释放)

之前能够把对象释放掉,主要是因为把这个对象是挂在了对象树上

Qt开发:初识Qt开发框架_#include_06

使用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出现了乱码问题:

Qt开发:初识Qt开发框架_字符串_07

使用qDebug()未出现乱码问题:

Qt开发:初识Qt开发框架_Qt_08

思考:在计算机中,一个汉字,占几个字节? 前提条件:当前中文编码使用的是哪种方式(字符集)

计算机存的其实是二进制集合。

表示汉字的字符集:有很多种,不同的字符集表示同一个汉字,使用的数字不相同!!

目前,表示汉字字符集,主要有两种方式:

  1. GBK(中国大陆) 使用2个字节表示一个汉字,windows默认的字符集为GBK
  2. 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");

Qt开发:初识Qt开发框架_字符串_09

QLineEdit内的文字是可编辑的

3.通过按钮的方式实现

Qt开发:初识Qt开发框架_Qt_10

Push Button的使用

Qt开发:初识Qt开发框架_字符串_11

在push button中想加入更多的交互功能就要使用Qt中的信号槽机制

初始信号槽机制: 本质就是给按钮的点击操作,关联上一个处理函数,当用户点击的时候,就会执行这个函数的处理函数。实现业务逻辑的处理。

connect函数

connect(ui->pushButton,...)

ui->pushButton 访问form file(UI文件)中创建的控件!!!

在Qt设计师中会给控件分配一个objectName属性。这个属性的值,要求在界面的唯一的。

这里的pushButton就是这个属性的name,同时我们也可以进行手动修改!

Qt开发:初识Qt开发框架_Qt_12

void MyWidget::handleClick()
{
    //当按钮被点击之后,就把按钮中的文本,进行切换。。。
    if(ui->pushButton->text()=="登录")
    {
        ui->pushButton->setText("qt");
    }
    else
    {
        ui->pushButton->setText("c++");
    }
}

Qt开发:初识Qt开发框架_#include_13

纯代码实现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

Qt开发:初识Qt开发框架_字符串_14

没有找到相关的槽函数,那么就找他的父类,因为可能继承自它的父类的槽函数

再搜索:QAbstractButton

正好在这里就找到了相关的槽函数和信号

Qt开发:初识Qt开发框架_#include_15