文章目录

  • 一 、对象树是什么?
  • 二、信号和槽的基本概念
    • 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界面功能的搭建变得简易和灵活,缺点在于由于需要遍历所有关联造成性能降低。

QT对象树、信号和槽机制相关推荐

  1. Qt学习:文件介绍+对象树+信号和槽

    Qt. 文章目录 Qt. 1.qr的优点 2.成功案例 3.QWidget.QMainWindow和QDialog之间的关系 4.mian.cpp文件 5..pro文件 6..h文件 7.命名规范+快 ...

  2. Qt中的信号与槽机制解析

    注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用. 所谓信号槽,简单来说,就像是插销一 ...

  3. qt学习之路3 ---信号与槽机制

    信号和槽机制 1.概述 Qt采用了一种全新的对象和方法的关联与通信机制,称为信号和槽机制.信号和槽机制是独立于标准C++编译器的,在编译之前需要经过Qt的专门预处理工具MOC(Meta Object ...

  4. Qt从入门到放弃——信号和槽机制(SigalSlot)

    标题信号和槽概念 Qt提供了信号和槽机制用于完成界面操作的响应,信号和槽机制是完成任意两个Qt对象之 间的通信机制.其中,信号会在某个特定情况或动作下被触发,槽是等同于接收并处理信号的函数. 例如,窗 ...

  5. Qt 信号和槽机制 优点 效率的详解

    一.信号和槽机制 Qt提供了信号和槽机制用于完成界面操作的响应,是完成任意两个Qt对象之间的通信机制. 其中,信号会在某个特定情况或动作下被触发,槽是等同于接收并处理信号的函数. 二..信号和槽机制的 ...

  6. Qt eventFilter实现信号与槽

    对于Qt来说,信号与槽机制是其通信的一大亮点,但是Qt中也提供了其他的方法实现数据间的通信,如invokeMethod反射机制实现通信(https://blog.csdn.net/xx18030637 ...

  7. QT5开发及实例学习之二信号和槽机制

    文章目录 前言 一.信号与槽机制的连接方式 二.信号与槽机制的优点 三.信号与槽机制的效率 前言 Qt提供了信号和槽机制用于完成界面操作的响应,信号和槽机制是完成任意两个Qt对象之间的通信机制.其中, ...

  8. QT之connect的第五个参数(信号与槽的使用)(qt对象树)

    目录 一 .QT connect 第5个参数一般不填,为默认值. 二.信号 三.connect函数原型 四.信号与槽的多种用法 五.槽的属性 一 .QT connect 第5个参数一般不填,为默认值. ...

  9. QT 的信号与槽机制介绍

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  10. 【qt】QT 的信号与槽机制

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

最新文章

  1. 深入Jetty源码之Servlet框架及实现(AsyncContext、RequestDispatcher、HttpSession)
  2. 15.1 自定义分词器
  3. HTML-参考手册: URL 编码
  4. EditThisCookie插件的使用方法
  5. SAP Odata batch操作,只支持multipart_mixed类型的content-type
  6. codeforces 160A-C语言解题报告
  7. 把tomcat的8080改为80端口
  8. 2020电信最新套餐一览表_最新!2020年宁波中学排名一览表
  9. 蓝牙耳机测试软件apk_蓝牙5.0手机如何测试检测分辨?这款免费APP帮大忙
  10. lammps计算聚合物例子_lammps计算金属扩散
  11. android qq 邮箱格式,QQ邮箱格式是什么_QQ邮箱写法正确格式
  12. Redis | 哨兵模式-Sentinel
  13. FH Admin fhadmn 源码项目下载获取 Java后台 springmvc mybatis SSM
  14. 催收行业再现“暴力(利)”
  15. 纵向手风琴html,CSS3制作垂直手风琴
  16. python画笑脸表情_用Matplotlib,妈妈再也不担心我没有表情包斗图了
  17. 云原生在京东丨揭秘五大云原生项目在京东的落地实践
  18. java 纳秒 格式化_Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。...
  19. 中文用户输入纠错 综述
  20. 【oracle作业5】PL/SQL应用

热门文章

  1. 【C】——C项目中的菜单功能(源码)
  2. 一些前端开发经典书籍推荐和下载链接分享
  3. 移动web开发DRP问题
  4. 水木告白工作室:Java从零入门之模仿头条资讯(一)
  5. python多线程多进程
  6. [精华][推荐]SSO CAS单点登录框架学习 搭建详细步骤及源码
  7. NYOJ2—括号配对问题
  8. 1.SoapUI接口测试--创建项目
  9. listview与gridview点击时的背景色取消
  10. 科讯SQL标签调用文章技巧