【Qt】Qt Hello World 程序

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会在定义得文件当中自动出现他的框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值