安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

Qt信号槽源码剖析

8月20日 颜如初投稿
  大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的?大部分人仍然不知道;也就是说大家只知道怎么使用,却不知道基于什么原理,显然这是不符合深层次发展的;那么今天我就给大家基于Qt源码以及示例代码深度剖析Qt的信号槽机制,一定会对大家有帮助。基本概念信号
  当对象改变其状态时,信号就由该对象发射(emit)出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。槽
  用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。信号与槽的连接QMetaObject::ConnectionQObject::connect(constQObjectsender,constcharsignal,constQObjectreceiver,constcharmethod,Qt::ConnectionTypetypeQt::AutoConnection)
  通过QObject::connect静态函数建立连接;其中sender与receiver是指向对象的指针,signal与method分别通过SIGNAL()与SLOT()宏来进行转换。元对象编译器
  MOC,theMetaObjectCompiler。
  Qt程序在交由标准编译器(例如MSVC)编译之前,先使用moc分析cpp头文件;如果它发现在一个头文件中包含了QOBJECT宏,则会生成另外一个cpp源文件(moc文件名。cpp),该cpp源文件中包含了QOBJECT宏的实现、运行时信息(反射)等。因此Qt程序的完整编译过程为moc预处理编译链接
  【领QT开发教程学习资料,点击下方链接莬费领取,先码住不迷路】
  点击领取链接示例代码Counter。h文件pragmaonceincludeQtCoreQObjectclassCounter:publicQObject{QOBJECTpublic:Counter();public:intvalue()publicslots:voidsetValue(intvalue);signals:voidvalueChanged(intnewValue);private:};Counter。cpp文件includeCounter。hCounter::Counter():mvalue(0){}intCounter::value()const{}voidCounter::setValue(intvalue){if(value!mvalue){emitvalueChanged(value);}}main。cpp文件includeQtCoreQCoreApplicationincludeCounter。hintmain(intargc,charargv〔〕){QCoreApplicationa(argc,argv);CountercounterA;CountercounterB;QObject::connect(counterA,SIGNAL(valueChanged(int)),counterB,SLOT(setValue(int)));counterA。setValue(10);counterA。value()10,counterB。value()10counterB。setValue(20);counterA。value()10,counterB。value()20returna。exec();}Qt宏
  宏定义在qobjectdefs。h文件中(位于QtCore目录)signalsslotsQOBJECTemitSIGNALSLOTQt信号槽的宏使用
  宏定义在qobjectdefs。h文件中(位于QtCore目录)signalsdefinesignalsQSIGNALSdefineQSIGNALSpublicQTANNOTATEACCESSSPECIFIER(qtsignal)defineQTANNOTATEACCESSSPECIFIER(x)
  推导出来的结果如下,即signals就是publicdefinesignalspublicslotsdefineslotsQSLOTSdefineQSLOTSQTANNOTATEACCESSSPECIFIER(qtslot)defineQTANNOTATEACCESSSPECIFIER(x)
  推导出来的结果如下,即slots为空defineslotsQOBJECTdefineQOBJECTpublic:QTWARNINGPUSHQOBJECTNOOVERRIDEWARNINGstaticconstQMetaObjectstaticMetaOvirtualconstQMetaObjectmetaObject()virtualvoidqtmetacast(constchar);virtualintqtmetacall(QMetaObject::Call,int,void);QTTRFUNCTIONSprivate:QOBJECTNOATTRIBUTESWARNINGQDECLHIDDENSTATICMETACALLstaticvoidqtstaticmetacall(QObject,QMetaObject::Call,int,void);QTWARNINGPOPstructQPrivateSignal{};QTANNOTATECLASS(qtqobject,)
  QOBJECT声明一些函数以及一个静态的QMetaObject对象,这些函数的实现位于MOC所产生的源文件中;因此,这些函数的声明与实现就都有了;
  精简版如下所示::defineQOBJECTpublic:staticconstQMetaObjectstaticMetaOvirtualconstQMetaObjectmetaObject()virtualvoidqtmetacast(constchar);virtualintqtmetacall(QMetaObject::Call,int,void);QTTRFUNCTIONSprivate:QDECLHIDDENSTATICMETACALLstaticvoidqtstaticmetacall(QObject,QMetaObject::Call,int,void);emit
  emit宏为一个空宏;它甚至没有被MOC解析,换句话说,emit只是可选的,没有任何意义(除了给开发人员一个提示)。defineemitSIGNALifndefQTNODEBUGdefineQLOCATIONFILE:QTSTRINGIFY(LINE)defineSIGNAL(a)qFlagLocation(2aQLOCATION)elsedefineSIGNAL(a)2aendifSLOTifndefQTNODEBUGdefineQLOCATIONFILE:QTSTRINGIFY(LINE)defineSLOT(a)qFlagLocation(1aQLOCATION)elsedefineSLOT(a)1aendifQt信号槽宏推导归纳definesignalspublicdefineslotsdefineQOBJECTpublic:staticconstQMetaObjectstaticMetaOvirtualconstQMetaObjectmetaObject()virtualvoidqtmetacast(constchar);virtualintqtmetacall(QMetaObject::Call,int,void);QTTRFUNCTIONSprivate:QDECLHIDDENSTATICMETACALLstaticvoidqtstaticmetacall(QObject,QMetaObject::Call,int,void);defineemitdefineSIGNAL(a)2adefineSLOT(a)1a如何查看预处理之后的代码
  在VisualStudio中按如下操作查看预处理之后的代码::右键工程【属性】菜单,弹出属性页对话框依次单击【配置属性】【CC】【预处理器】设置【预处理到文件】选项值为是工程编译
  预处理之后代码与初始代码对比
  Counter类声明对比
  Counter类定义对比
  main函数对比
  因此,上述分析一目了然,理论推导与实践结果是高度一致的;
投诉 评论

火箭爵士酝酿2换2交易,贾巴里史密斯马尔卡宁互换东家?火箭队连续两个赛季排名全联盟垫底,但主教练史蒂芬塞拉斯依然帅位稳定,而本赛季他似乎不会再有这样的好运气,战绩上的毫无起色已经让休斯顿的球迷愤怒。近期,美媒《休斯顿纪事报》的一份……疑似一加NordCE3新机配置曝光骁龙695搭配一亿像素主摄本月高通的下一代移动旗舰芯片骁龙8Gen2即将发布,一加也正在加紧下一代旗舰手机一加11系列的研发进度,不过除了一加11系列以外,海外市场一加的中低端手机也在紧锣密鼓的安排中,……红屁股警告,宝宝臀部护理别大意大多数婴幼儿在某个时期会出现红屁股,怎么做可以让宝宝摆脱困扰呢?下面这份尿布皮炎指南,各位新手爸妈注意查收哦!图为网图侵权立删一、什么是尿布皮炎婴幼儿尿布皮炎……Qt信号槽源码剖析大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的?大部分人仍然不知道;也就是说大家只知道怎么使用,却不知道基于什么原理,显然这是不符合深层次发展……广东人喝酒怪象少见茅台,不摆五粮液,而是更偏爱这4款小众酒广东省,由于地理位置比较优越,不仅是沿海城市,也是开放时间比较早的城市,所以这个地方的经济发展是比较迅速,也是全国经济比较发达的城市。在大多大多数省外酒友的眼里,广东人非……太爱干净了有损福报有人一年不洗一次澡,也有人一天恨不得洗三次,早中晚各一次。我们总是以为,地拖干净,桌子擦干净。垃圾扫起来拿去扔掉,就是爱干净了。其实你有没有想过,因为你太爱干净了,……日媒三季度全球智能手机出货量同比下降12据《日本经济新闻》网站11月1日报道,康特波因特研究公司发布的数据显示,今年第三季度全球智能手机出货量为3。01亿部,比去年同期减少12。出货量连续5个季度减少,通货膨胀和经济……一哥8年6进总决不常有只有真正伟大球员才能做到詹姆斯算一个直播吧6月5日讯今日勇士老将伊戈达拉在球队训练结束后接受了媒体采访。记者:为什么为了夺冠你总是奋不顾身?伊戈达拉:有些人不知道总决赛的重要性,这不是他们的错。这只是……CBA三消息北控主帅官宣外援,山东悍将已入境,哈德森无人问津大家好呀,我是北柠,各位小伙伴们要养成先赞后看的习惯哦!北控队这个休赛期一直非常低调,球队从来没有宣布过自己的外援引进情况,毕竟上个赛季的时候球队确实吃了一点苦头,当时北……周琦登上澳洲当地报纸凤凰队官方猜猜是谁回来了?北京时间10月12日,周琦回到球队的消息登上澳大利亚墨尔本当地媒体的报纸,东南墨尔本凤凰队也把报纸的截图发到了球队的官方社媒,并配文:猜猜是谁回来了?周琦上个赛季开始之前……卫生纸情书暖冬生活记微风炸起,吹皱一池春水。这都冬天了,你发春了吧,还春水。这是一种意象懂不懂。那还真不懂,不过如果你说你床上那张纸的话,那确实是皱了。是啊……聪明人的自律寡言,独行,克欲生活如同海洋,大事小事就像浪潮般,一波一波地向我们袭来。平庸的人陷入其中,随波逐流,往往会被折腾得精疲力尽,甚至被卷入危险之中。聪明的人却像优秀的弄潮儿,于波浪之中……
多年来,你的心在哪里?吃鸡又一款中国风皮肤来袭!Pigff排面拉满,红金配色DBS一加Ace官图曝光,搭载天玑8100处理器,高管信心满满塞上撷英丨秋的颜色512GB大内存手机价格暴跌!旗舰芯1亿像素主摄,仅售219建议中老年人入夏后,碱性蔬菜韭菜山药多吃些,健康度夏林志颖详谈伤势状况右手无力拿不起梳子,体重跟13岁长子一样能尬舞的机器人?家长们慌了!孩子被人工智能取代,已成定局了?脂肪最怕这肉!高蛋白低脂肪,2分钟出锅,嫩嫩的一口爆汁儿啊捷报频频!国乒连胜,世界冠军轰出111,伊藤美诚混双遭一轮游刘维伟带队首训,陶汉林体重超标,王治郅NBA选秀报告曝光进入更年期,潮热烦闷失眠?送你三种调理方法,建议都试试数码知识微信群怎么升级500人群扫码进群200人后怎么用二维泰森曾有躲避刘易斯之嫌,支付刘易斯400万美金让路费,老刘赚美国割了中国的韭菜加湿器设备怎么选购选购加湿器设备需要注意什么详解惊心动魄的故事海峡群岛是王室属地宪法地位的真正起源《月光曲》教学反思互联网始于去中心化、成熟于中心化,未来将回归原点福懋动物医院科学研究表明,看猫舔毛可有效缓解压力以党的群众路线观引领宣传思想文化工作国家公务员面试注意事项2019年鸡蛋的价格至今,市场价格跌宕起伏,养殖户迷茫了该如

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利