Qt对象树 | 信号和槽

1.Qt对象树
1.1.基本理解

在这里插入图片描述
Qt中创建很多对象都提供一个Parent父类对象指针,默认是nullptr,需要指定父类对象。我们创建的对象会自动添加到我们指定的父类对象(这里的父类并不是指继承意义上的父类)的children()列表,当父类对象析构的时候,这个children列表中的对象全部都会被析构! 当然这里可以通过构造函数或者setParent 方法将我们创建的对象添加到对象树上。
例如:⼀个按钮有⼀个 QShortcut(快捷键)对象作为其⼦对象。当删除按钮的时候,这个快捷键理应被删除。而我们在QWidget中创建组件是因为QWidget继承QObject,所以它也继承了对象树的功能。
Qt 引⼊对象树的概念,在⼀定程度上解决了内存问题,所以在创建的时候,尽量在构造的时候就指定 parent 对象,并且⼤胆在堆上创建,类似Java当中的垃圾回收机制。

1.2.练习

完整的测试代码在这里呢:链接
创建一个MyPushButton继承QPushButton,new 上一个MyPushButton对象,并将MyPushButton对象添加到QWidget父对象上,没有手动释放MyPushButton对象,关闭QWidget界面(释放)也会其挂载上的MyPushButton对象释放。

在这里插入图片描述

创建C++头文件和源文件:
在这里插入图片描述填上Class name ,选择QWidget,然后一路下一步
在这里插入图片描述

2.信号与槽
2.1.基本理解

在这里插入图片描述
上面用户点击关闭按钮或者的点击"右上角的选项",这样和控件的每次交互过程称为⼀个事件每个事件都会产生一个信号!
Qt 中的所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作,对信号做出的响应动作就称之为槽。
其实在底层信号和槽机制是通过函数间的相互调⽤实现的。 信号用一个函数表示,称这个函数为信号函数, 同理每个槽也可以⽤函数表⽰,称为槽函数
在QObject 类提供了⼀个静态成员函数connect()来关联信号和槽。

connect (const QObject *sender, 
		 const char * signal ,
		 const QObject * receiver , 
		 const char * method , 
		 Qt::ConnectionType type = Qt::AutoConnection )

sender:信号的发送者、signal:发送的信号(信号函数)、receiver:信号的接收者、method:接收信号的槽函数、type: ⽤于指定关联⽅式,默认的关联⽅式为 Qt::AutoConnection,通常不需要⼿动设定。
关键上面的概念我们就可以快速的实现通过点击关闭按钮来完成关闭窗口的这样的功能,而不用点击右上角的叉叉:

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
	// 添加这两行
    QPushButton* button = new QPushButton("关闭按钮",this);
    connect(button,&QPushButton::clicked,this,&QWidget::close);
}

Widget::~Widget()
{
    delete ui;
}
2.2.查看内置信号和槽

上面的&QPushButton::clicked和&QWidget::close就是qt中内置的函数。我们通过查看Qt的文档来查看内置的一些函数。
在文档的contents找到Signals或Slots这样关键字的目录,没有则区它的父类中查找。
在这里插入图片描述

2.3.通过 Qt Creator ⽣成信号槽

先创建一个基本的QWidget项目,如何去ui文件:
在这里插入图片描述
选中对应的信号函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.自定义信号和槽
3.1.快速入门

1.自定义信号函数
⾃定义信号函数必须写到 “signals” 下、返回值为 void,只需要声明,不需要实现、可以有参数,也可以发⽣重载
2.⾃定义槽函数
早期的 Qt 版本要求槽函数必须写到 “public slots” 下,但是现在⾼级版本的 Qt 允许写到类的"public" 作⽤域中或者全局下、返回值为 void,需要声明,也需要实现、可以有参数,可以发⽣重载
3.发送信号
使⽤ “emit” 关键字发送信号 。“emit” 是⼀个空的宏,提醒开发人员。
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值