[信号与槽.docxVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[信号与槽

meta object网上关于元对象的解释已经很多了,所以我们简单提一下就可以了:派生自QObject的类可以添加一个 Q_OBJECT 宏#define Q_OBJECT /public: / Q_OBJECT_CHECK / static const QMetaObject staticMetaObject; / virtual const QMetaObject *metaObject() const; / virtual void *qt_metacast(const char *); / QT_TR_FUNCTIONS / virtual int qt_metacall(QMetaObject::Call, int, void **); /private:运行 moc 对包含该类的文件进行预处理moc xxx.h -o moc_xxx.cpp生成的该文件包含我们元对象的所有信息,为了清楚起见,看一下QMetaObject定义的数据成员部分:struct QMetaObject{......private:struct { // private data const QMetaObject *superdata; const char *stringdata; const uint *data; const void *extradata; } d;}你可以随便找一个moc_xxx.cpp文件,会发现里面一个字符数组和整数数组。对应这儿的stringdata和data信号与槽正常情况下,moc 生成的文件中包含信号与槽的信息,而每一个信号或槽有一个对应的字符串(对应函数原型)有一个索引有一个函数定义体(信号和槽都是一个普通的函数)如何工作?信号和槽以字符串形式传递给connectbool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )connect 从元对象系统查找信号与槽,找到的话,调用QMetaObject::connect建立二者索引之间的联系(这是私有函数,我们可以看到这儿涉及到的只是索引值)bool QMetaObject::connect(const QObject *sender, int signal_index, const QObject *receiver, int method_index, int type = 0, int *types = 0);信号的发射:信号是一个普通的函数,该函数将调用所有与之关联的槽函数或信号函数等void QMetaObject::activate(QObject *sender, const QMetaObject *, int local_signal_index, void **argv);如何被调用:前面说connect保存了索引值,而根据索引找到函数并调用是通过 qt_metacall 完成的动态信号与槽仅仅静态生成信号与槽有些时候是不够用的,比如QAxObject和QAxidget信号与槽都是动态生成的,再就是QtScript模块,script定义的信号与槽,也只能是动态的。Qt Quarterly 中有一篇文章专门介绍动态的信号与槽的实现 Dynamic Signals and Slots信号与槽的连接:文中使用了connectDynamicSlot 和 connectDynamicSignal ,而不是我们熟悉的 connect信号与槽的实现:静态情况下,它们都是普通的函数,然后qt_metacall 根据索引值就可以调用它们;动态情况下,信号和槽是个数可变的,qt_metacall 如何将索引值和信号槽对应起来?信号和槽的实现如何存储?Q_OBJECT动态信号槽,我们不能直接包含这个宏,但是这个宏展开后的函数我们还是需要的,由于不能用moc,我们只能自己来实现这个些函数了。最重要的应该是这两个函数 virtual const QMetaObject *metaObject() const; virtual int qt_metacall(QMetaObject::Call, int, void **); 在 Dynamic Signals and Slots 一文中,由于引入了自己的connect方法,所以连 metaObject() 这个也不需要的。只剩下一个: int DynamicQObject::qt_metacall(QMetaObject::Call call, int

文档评论(0)

popo786 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档