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维边缘提取中体现在提取边缘轮廓后将一些梯度方向变化率较小…

【数据结构】——冒泡排序、插入排序、选择排序

# 冒泡排序,复杂度为O(n^2) def bubble_sorted(li:list)->list:for i in range(len(li)):# 第几趟exchanged False# 这个是为了防止多余的遍历,如果前面的元素已经是排序好的,那就不需要再进行比较了,减少运行时间for j in ra…

【转载】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…

python 计算器

--coding:utf-8-- from Tkinter import * 创建横条型框架 def frame(root, side): w Frame(root) w.pack(side side, expand YES, fill BOTH) return w 创建按钮 def button(root, side, text, command None): w Button(root, text text, command command) w.pack(side…

最长公共子序列(LCS)

注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence&#x…

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

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

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

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

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

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

二分法php

二分法。分别使用while循环的方法和递归调用的方法。 <?php// 二分法的使用数组必须是有序的&#xff0c;或升序&#xff0c;或降序 $arr array(1, 3, 5, 7, 9, 13 );// 递归调用&#xff08;相比较好理解 function bsearch_r($v, $arr, $low, $high){if ($low > $high…

【JZOJ4861】【NOIP2016提高A组集训第7场11.4】推冰块

题目描述 Dpstr最近迷上了推冰块。冰地是一个n行m列的网格区域&#xff0c;第i行第j列的格子记为(i,j)&#xff0c;也就是左上角为(1,1)&#xff0c;右下角为(n,m)。每个格子可能是冰面、障碍物、减速带三者之一。其中&#xff0c;冰地外围&#xff08;即第0行、第n1行、第0列、…

【图像处理面试题】——1

链接&#xff1a;https://www.jianshu.com/p/e58ca1775700 1、给定0-1矩阵&#xff0c;求连通域。2、写一个函数&#xff0c;求灰度图的直方图。3、写一个均值滤波&#xff08;中值滤波&#xff09;。4、写出高斯算子&#xff0c;Sobel算子&#xff0c;拉普拉斯算子等&#xff…

IT运维服务管理问题总结 #F#

1.管理现状问题&#xff1a;支撑企业业务运行的IT系统主要由大量的网络设备、主机系统和应用系统组成&#xff0c;这些设备和系统从应用角度来分又属于不同的业务系统和部门&#xff0c;网络设备、主机系统等具备独立的用户管理、认证授权和审计系统&#xff0c;且由不同的系统…

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

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

MATLAB调用Python自定义函数(类、函数等) Python调用MATLAB

一、MATLAB调用Python函数 参考链接&#xff1a;https://blog.csdn.net/qq_27280237/article/details/84644900 知乎链接&#xff1a;https://zhuanlan.zhihu.com/p/92081119 知乎上这位说的更加的详细&#xff0c;感谢 二、Python调用MATLAB-API 知乎链接&#xff1a;htt…

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

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