zoukankan      html  css  js  c++  java
  • Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)

         因为面试时问了我这道题,导致我想去了解信号槽到底是如何实现的,于是贴着顺序看了下源码,大致了解了整个框架。网上关于信号槽的文章也很多,但是大部分都是将如何应用的,这里我就写一下我所理解的如何实现吧, 由于时间仓促,源码阅读的也不甚仔细,难免导致最终理解有偏差或错误,大家看出了请一定指正。

          首先:信号槽其实就是三部分组成:信号的声明,槽的声明和实现 以及 connect函数。这其中我觉得最重要的就是这个connect函数了。

          1:对于Qt中的每个含有Q_OBJECT的类对象,其内部都有一个类对象数据成员等。我觉得他们是用来保存一个二维表的。亦即:是保存的一个信号和槽的二维表。对于某一个信号:在二维表中存放着这个信号对应的槽的函数指针!(面试官也问过我:想没想过用函数指针来代替信号槽)。所以:要想实现信号槽,只需要把每个对象的这个表填满就OK。而填满的过程就是依据connect函数来做的。

          2:对于一个connect函数,其含有发出信号的对象 和 接受者对象的指针,所以它可以同时操作这两者。当执行到它时:它会依据接收者的指针去获得:槽的函数指针,而后用这个函数指针值去填充发出信号的对象的二维表。

          3:当用connect填充好二维表之后:我们每次emit signal_1()时:其实就是依据这个信号的名字去查询二维表,找到对应的槽的函数指针并进行调用而已。

         当然了,在具体实现上肯定没这么简单,

         1:依据信号名来查找槽的函数指针:其实是先依据信号名找到其在对象内部的一个代表参数,而后用这个参数去查找。

         2:每个对象在创建时都会创建一个QMetaObejct元对象数据成员,这个主要功能之一就是用来做信号槽的二维表的。

         3:正如荆鹏大牛所言:这其中还有类型安全的检查设定等等~~

         所以:信号槽这个东西也没多么神秘,我们完全可以自己架设这样一个构架。

    http://blog.csdn.net/nrc_douningbo/article/details/5701935

  • 相关阅读:
    2017年系统架构设计师论文范文
    在SQL Server 2008中执行透明数据加密(转自IT专家网)
    开发笔记
    [置顶] GO-Gin框架快速指南
    [置顶] JS-逆向爬虫
    [置顶] ES篇
    [置顶] GO
    [置顶] 爬虫入狱指南
    [置顶] websocket
    [置顶] Linux篇
  • 原文地址:https://www.cnblogs.com/findumars/p/5031161.html
Copyright © 2011-2022 走看看