QT学习第二天(2)

QT学习第二天(2)
一、QT助手的了解与使用
在这里插入图片描述

二、QT对象树
1.对象树的理解
类有一个私有变量,这个变量专门用来储存设定了这个类为父对象的众多类,把这个储存的叫做父对象,一个类创建并指定父对象时,就会把自己加到父对象的列表里面。
2.使用对象树的好处
好处就是当父对象被析构的时候,子对象也会被析构,这样就避免了我们写一大堆的delete。
3.对象树的坏处
在这里插入图片描述

就如图所示,我指定Widget w 为button的父对象,程序执行就会崩溃,在此过程中button是在栈上的,但是button的一些数据是用new生成的,也就是说这些数据是在堆上面的,析构的时候会使用delete对这些数据释放(系统机制,会自动释放),但是在Widget w析构的时候就会随着Widget w一起释放了,这次又释放了一次,当然会导致崩溃了,因为栈上可以释放两次,但是堆上是不允许的。
4.改变创建顺序
在这里插入图片描述

如上图所示,当改变了创建的顺序时,崩溃的问题就不存在了,这是因为第二次的释放是Widget w析构引发的,它会通过查询的方式判断button已经被释放了,所以就不会被二次释放。
三、信号和槽
1.信号和槽的理解
信号是发出去的,而槽是接收的,信号是在特点情况下被发射的事件,槽是对不同信号处理,槽可以定义在类的任何部分,可以被直接调用。
2.信号和槽的小程序
通过按下按钮关闭窗口
首先确定发出信号的是按钮,使用QT助手找到对应的函数
在这里插入图片描述
在这里插入图片描述

然后确定槽是窗口
在这里插入图片描述
在这里插入图片描述

调用所对应的接口
在这里插入图片描述

三、 自定义信号和槽
1.创建信号类
#ifndef BOY_H
#define BOY_H

#include

class Boy : public QObject
{
Q_OBJECT
public:
explicit Boy(QObject *parent = nullptr);

signals:
void love();//不用实现 必须是void类型

};

#endif // BOY_H
2.创建槽
#ifndef GIRL_H
#define GIRL_H

#include

class Girl : public QObject
{
Q_OBJECT
public:
explicit Girl(QObject *parent = nullptr);

signals:
public slots:
void ack_love();
};

#endif // GIRL_H
3.实现槽函数
#include “girl.h”
#include

Girl::Girl(QObject *parent) : QObject(parent)
{

}

void Girl::ack_love()
{
qDebug()<<“好呀好呀”;
}
4.调用调试
Widget w;
Boy dsn(&w);
Girl bfm(&w);
w.connect(&dsn,&Boy::love,&bfm,&Girl::ack_love);//依托widget调用connect
w.show();
emit dsn.love();//emit是发出信号的标志 可要可不要

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值