QT对象树、信号和槽机制

文章目录

  • 一 、对象树是什么?
  • 二、信号和槽的基本概念
    • 2.1 信号
    • 2.2 槽
    • 2.3 松散耦合
    • 2.4 特点
  • 三、示例
  • 总结


一 、对象树是什么?

对象树是由父类和若干子类对象组成,而子类也可以由若干孙类。
QT中的对象树是以QObject为起始父类来完成树的构建的,如下图所示。
在这里插入图片描述
当创建子类对象(QObject )的时候,会传递一个parent指针给子类的构造函数,该指针就是父对象指针。

//QWidget 为myWidget的父类
myWidget::myWidget(QWidget *parent): QWidget(parent)
{
}class myWidget : public QWidget
{Q_OBJECT
//parent 父对象指针传递给子类的构造函数。
public:myWidget(QWidget *parent = 0);
};

所以在创建 QObject 对象时,会提供一个父对象的指针给构造函数,QObject 对象就会自动添加到其父对象的 children() 列表。然后当父对象进行析构的时候,这个子对象列表中的所有对象都会被析构,当析构子对象的时候,会自动从父对象的子对象列表中删除。

这种对象树机制的优点在于析构父类的析构时,子类对象会自动销毁,这样就不需要关注控件内存的销毁情况。

但也会存在特殊情况会造成QT程序内存泄漏问题,这样就需要我们手动删除或者调用析构函数。
1:parent指针不会区分child对象是new出来的还是从栈上分配的,如果delete栈上的内存,就会发生错误。避免这一情况的方法就是全部使用new来开辟空间。

2:可以尝试采用智能指针QPointer(模板类)的方法来自动销毁内存空间。

3:Qt的对象清理器QObjectCleanupHandler也可以自动删除所有监视对象。

二、信号和槽的基本概念

信号槽机制类似于C#中回调函数的概念,我们知道,回调函数的本质是函数作为参数在合适的时候(条件成立时)被某一特定的事件调用的方法,而信号槽机制是如果触发事件,对象就会发出信号给接收者,然后调用绑定的槽函数,其中相似之处在于这两种方式都会在满足某一条件时触发事件,信号类似于条件达成的方法,槽函数就像被委托调用的方法。

C#是通过委托来实现函数作为参数传递的,信号槽机制则是通过连接的方式实现的信号和槽的绑定。

2.1 信号

信号signal也是由不同的方法组成的,例如,按钮的信号有9种,分别继承自三个类QAbstractButton,QWidget,QObject:
在这里插入图片描述
分别表示点击、按压、松开、开关等不同状态。
我们可以在自定义类里自定义信号:

signals://自定义信号写到signals下//返回值是void,只需要声明,不需要实现//可以有参数,可以重载//emit hungry();来发送信号void hungry();void hungry(QString food);

2.2 槽

槽(slot)的本质是类的成员函数,其参数可以是任意类型的,可以实现不同的功能,如关闭,隐藏,下降,上升等。例如QWidget类下槽函数包括:
在这里插入图片描述
自定义槽:

public slots://返回值是void,需要声明,也需要实现//可以有参数,也可以重载void eat();void eat(QString food);

2.3 松散耦合

信号和槽是松散耦合的。
松散耦合是指槽可以与信号连接(connect)在一起,只有连接的信号被激发的时候,才能调用槽函数。

2.4 特点

1:一个信号可以连接多个槽函数。多个信号也可以连接同一个槽函数。
2:信号和槽函数,参数必须一一对应。

三、示例

使用一个定时器的demo做一个简单的示例。
定义两个定时器,实现显示数字的功能。

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//启动定时器,每隔1s启动一次id1 =startTimer(1000);id2 =startTimer(2000);//定时器的一种方式QTimer *timer = new QTimer(this);timer->start(500);//超时信号和显示槽函数建立连接,timer一超时便发送一个信号setText方法递增1connect(timer,&QTimer::timeout,[=](){static int num = 1;ui->label_3->setText(QString::number(num++));});//点击暂停按钮实现connect(ui->pushButton,&QPushButton::clicked,[=](){timer->stop();});
}

另外一种方法需要定义定时器的事件,用来显示数字。

void Widget::timerEvent(QTimerEvent *event)
{//number()方法转stringif(event->timerId() == id1){static int num = 1;ui->label->setText(QString::number(num++));}if(event->timerId() == id2){static int num2 = 1;ui->label_2->setText(QString::number(num2++));}
}

总结

对象树和信号槽机制使QT界面功能的搭建变得简易和灵活,缺点在于由于需要遍历所有关联造成性能降低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】——归并排序

目录 一、代码 二、随笔 一、代码 归并排序的主要思路:将两个有序的子列表归并为一个有序的大列表 #归并函数,假设li是由左右两个有序的子列表组成,假设两个子列表都是从小到大排好序的列表 def merge(li,low,mid,high)::param li: 由左右两个有序的子列…

开发发布npm module包

开发发布npm module包 问题 在项目开发过程中,每当进入一个新的业务项目,从零开始搭建一套前端项目结构是一件让人头疼的事情,就要重新复制一个上一个项目的前端框架和组件代码库。其中很多功能的模块组件都要重复拷贝,可以统一将…

如何使用ATS提高应用的安全性

App Transport Security,简短的说就是ATS,是iOS9和OS X El Capitan的一个新特性。App Transport Security 的目标是提高Apple 操作系统的安全性以及在此操作系统上运行的任何应用的安全性。 基于HTTP传输数据的网络请求都是明文。开启App Transport Secu…

手机客户端测试考虑的点

手机客户端测试考虑点总结 版权声明:本文为博主原创文章,未经博主允许不得转载。 此文未本人工作中的总结,特此总结。 异常场景: 网络异常,服务器异常,接口异常或参考参数篡改,断电,…

NMS(非极大值抑制)算法详解与示例

一、NMS是什么? NMS(non maximum suppression)即非极大值抑制,广泛应用于传统的特征提取和深度学习的目标检测算法中。 NMS原理是通过筛选出局部极大值得到最优解。 在2维边缘提取中体现在提取边缘轮廓后将一些梯度方向变化率较小…

【转载】ASP.NET应用程序与页面生命周期

在本文中,我们将了解不同的事件,ASP.NET 应用程序的生命周期以浏览器向 Web 服务器(对于 ASP.NET 应用程序,通常为 IIS)发送请求为起点,直至将请求结果返回至浏览器结束。在这个过程中,首先我们…

基于PCL的ICP及其变种算法实现

文章目录前言一、ICP算法基础1.1 提取待匹配点对1.2 计算旋转平移矩阵1.3 计算变换后的点和目标点之间的偏差二、ICP算法变种2.1 PLICP2.2 PointToPlane ICP2.3 NICP2.4 LM_ICP三、程序示例1. 传统方法2. PointToPlane ICP总结前言 ICP(Iterative Closest Point&am…

【数据结构】——排序算法系列总结

目录 1、空间复杂度 2、稳定性 3、运行时间 4、目前默认的sort内置函数排序函数 5、六种常用排序方法 1、空间复杂度 空间复杂度产生的原因有两个:①重新定义了一块空间用于存储数据;②递归产生了栈空间 冒泡排序、选择排序、堆排序和插入排序属于…

Spring Boot实践教程(二):SpringApplication分析

2019独角兽企业重金招聘Python工程师标准>>> 本文会通过分析上一篇中跑起来的示例程序来分析一下Spring Boot程序运行的基本原理。 概要 在上一篇的介绍中,程序是通过SpringBoot1HelloworldApplication.main()方法运行起来的: public static …

基于PCL的MLS(移动最小二乘)算法简介与示例

一、MLS基础 mls算法本质上和最小二乘一样,是一种拟合数据的算法。区别在于mls是局部的,即通过系数向量和基函数分别对数据中不同位置的节点区域进行拟合,需要计算出全部节点域的拟合函数的参数。而传统的最小二乘是全局的,采用所…

基于PCL的RANSAC(随机采样一致)算法简介与示例

前言 RANSAC(Random sample consensus,随机采样一致)是3D点云拟合的一种重要的手段,可以对直线、圆、平面,圆球、圆柱等形状的点云进行拟合,其优点在于可以最大程度上减少噪声点对拟合效果的影响。 一、RA…

Testin云測与ARM 战略合作:推动全球移动应用加速进入中国市场

Testin云測与ARM 战略合作:推动全球移动应用加速进入中国市场 2014/10/14 Testin 业界资讯(中国北京–2014年10月14日 )全球最大的移动游戏、应用真机和用户云測试平台Testin云測今日宣布与ARM建立战略伙伴合作关系,设立“ARM应…

正则表达式快速入门,转载

正则表达式快速入门 首先简单介绍下正则表达式: 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。 下面就看看正则表达式里…

【pyqt5】配置Qt Designer之【designer.exe的保存位置及ui文件转py文件及no Qt platform plugin could be initialized 问题解决】

目录 一、寻找designer.exe 二、no Qt platform plugin could be initialized 问题解决 三、ui文件转换为py文件 四、pyqt5的使用教程 一、寻找designer.exe 头疼,找了一上午都没有找到这个的路径,最后还是在评论区看到的,这也不能怪人家…

PCL中GreedyProjection三角化算法简介与示例

文章目录前言一、PCL点云三角化1.1 Delaunay三角剖分1.2 贪婪三角化二、程序示例总结前言 Delaunay三角剖分最初应用于2维领域,而与Greedy三角化算法的结合,使之成为目前在三维重建领域最为基础的算法原理之一,很多学者针对其原理进行改进用…

【pyqt5】 读取numpy arrray 显示图片

目录 1、GUI界面(QT designer设计) 2、逻辑函数(回调等) 3、显示图片在label上 0)直接利用QPixmap显示图像 1)显示彩色图 彩色图显示色调不正常——opencv(BGR)QT(RGB)需要进行…

【pyqt5】——入门级模板(ui文件+ui转py文件+逻辑py文件)(消息提示框)

目录 1、ui文件 2、ui转py文件 3、逻辑py文件 4、实例 1)ui文件——demo.ui 2)ui转py文件——demo.py 3)逻辑py文件——demoLogic.py 4)运行结果 1、ui文件 这个文件是直接通过pyqt5 designer进行设计的,相关配置可见《配置Qt Design…

PCL中点特征描述子PFH、FPFH和VFH简述和示例

文章目录前言一、点特征直方图1.1 PFH1.1.1 法线估计1.1.2 特征计算1.2 FPFH1.3 VFH二、示例2.1 PFH计算2.2 FPFH2.3 VFH前言 点特征直方图是PCL中非常重要的特征描述子,在点云匹配、分割、重建等任务中起到关键作用,可以对刚体变换、点云密度和噪声均有…

来一个炫酷的导航条

本文分享一个带动画效果的中英文切换导航条。 鼠标放上去试一下&#xff1a; INDEX 首页 BBS 社区 HOME 我 1.用CSS3实现 效果看上去复杂&#xff0c;其实我们先来做出一个样式&#xff0c;就很简单了。如下&#xff1a; 代码&#xff1a; <nav><ul class"list…

EXCEL小技巧:如何统计非空单元格

http://club.excelhome.net/thread-1187271-1-1.html 下面教大家如果用函数统计非空单元格的数量 首先我们来介绍几个统计函数&#xff1a; 1.COUNT(value1,value2,...) 统计包含数字的单元格个数 2.COUNTA(value1,value2,...) 统计非空单元格的个数 3.COUNTBLANK(range&…