范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Qt信号槽源码剖析

  大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的? 大部分人仍然不知道;也就是说大家只知道怎么使用,却不知道基于什么原理,显然这是不符合深层次发展的;那么今天我就给大家基于Qt源码以及示例代码深度剖析Qt的信号槽机制,一定会对大家有帮助。基本概念信号
  当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。槽
  用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。信号与槽的连接QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,  const QObject *receiver, const char *method,  Qt::ConnectionType type = Qt::AutoConnection)
  通过QObject::connect静态函数建立连接;其中sender与receiver是指向对象的指针,signal与method分别通过SIGNAL()与SLOT()宏来进行转换。元对象编译器
  MOC, the Meta Object Compiler。
  Qt程序在交由标准编译器(例如MSVC)编译之前,先使用moc分析cpp头文件;如果它发现在一个头文件中包含了Q_OBJECT宏,则会生成另外一个cpp源文件(moc_文件名.cpp),该cpp源文件中包含了Q_OBJECT宏的实现、运行时信息(反射)等。因此Qt程序的完整编译过程为moc->预处理->编译->链接
  【领QT开发教程 学习资料,点击下方链接莬费领取  ,先码住不迷路~】
  点击 领取「链接」示例代码Counter.h文件#pragma once #include   class Counter : public QObject {     Q_OBJECT  public:     Counter();  public:     int value() const;  public slots:     void setValue(int value);  signals:     void valueChanged(int newValue);  private:     int m_value; }; Counter.cpp文件#include "Counter.h"  Counter::Counter():m_value(0) { }  int Counter::value() const {     return m_value; }  void Counter::setValue(int value) {     if (value != m_value)     {         m_value = value;         emit valueChanged(value);     } } main.cpp文件#include  #include "Counter.h"  int main(int argc, char *argv[]) {     QCoreApplication a(argc, argv);      Counter counterA;     Counter counterB;     QObject::connect(&counterA, SIGNAL(valueChanged(int)),      			     &counterB, SLOT(setValue(int)));      counterA.setValue(10);//counterA.value()=10, counterB.value()=10     counterB.setValue(20);//counterA.value()=10, counterB.value()=20      return a.exec(); } Qt宏
  宏定义在qobjectdefs.h文件中(位于QtCore目录)signalsslotsQ_OBJECTemitSIGNALSLOTQt信号槽的宏使用
  宏定义在qobjectdefs.h文件中(位于QtCore目录)signals#define signals Q_SIGNALS #define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal) #define QT_ANNOTATE_ACCESS_SPECIFIER(x)
  推导出来的结果如下,即signals就是public#define signals public slots#define slots Q_SLOTS #define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot) #define QT_ANNOTATE_ACCESS_SPECIFIER(x)
  推导出来的结果如下,即slots为空#define slots Q_OBJECT#define Q_OBJECT  public:      QT_WARNING_PUSH      Q_OBJECT_NO_OVERRIDE_WARNING      static const QMetaObject staticMetaObject;      virtual const QMetaObject *metaObject() const;      virtual void *qt_metacast(const char *);      virtual int qt_metacall(QMetaObject::Call, int, void **);      QT_TR_FUNCTIONS  private:      Q_OBJECT_NO_ATTRIBUTES_WARNING      Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);      QT_WARNING_POP      struct QPrivateSignal {};      QT_ANNOTATE_CLASS(qt_qobject, "")
  Q_OBJECT声明一些函数以及一个静态的QMetaObject对象, 这些函数的实现位于MOC所产生的源文件中;因此,这些函数的声明与实现就都有了;
  精简版如下所示::#define Q_OBJECT  public:      static const QMetaObject staticMetaObject;      virtual const QMetaObject *metaObject() const;      virtual void *qt_metacast(const char *);      virtual int qt_metacall(QMetaObject::Call, int, void **);      QT_TR_FUNCTIONS  private:      Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); emit
  emit宏为一个空宏; 它甚至没有被MOC解析,换句话说,emit只是可选的,没有任何意义(除了给开发人员一个提示)。#define emit SIGNAL#ifndef QT_NO_DEBUG #define QLOCATION "" __FILE__ ":" QT_STRINGIFY(__LINE__) #define SIGNAL(a)   qFlagLocation("2"#a QLOCATION) #else #define SIGNAL(a)   "2"#a #endif SLOT#ifndef QT_NO_DEBUG #define QLOCATION "" __FILE__ ":" QT_STRINGIFY(__LINE__) #define SLOT(a)     qFlagLocation("1"#a QLOCATION) #else #define SLOT(a)     "1"#a #endif Qt信号槽宏推导归纳#define signals public #define slots #define Q_OBJECT  public:      static const QMetaObject staticMetaObject;      virtual const QMetaObject *metaObject() const;      virtual void *qt_metacast(const char *);      virtual int qt_metacall(QMetaObject::Call, int, void **);      QT_TR_FUNCTIONS  private:      Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); #define emit #define SIGNAL(a)   "2"#a #define SLOT(a)     "1"#a 如何查看预处理之后的代码
  在Visual Studio中按如下操作查看预处理之后的代码::右键工程【属性】菜单,弹出属性页对话框依次单击【配置属性】-->【C/C++】-->【预处理器】设置【预处理到文件】选项值为"是"工程编译
  预处理之后代码与初始代码对比
  Counter类声明对比
  Counter类定义对比
  main函数对比
  因此,上述分析一目了然,理论推导与实践结果是高度一致的;

一块7号冰,足以冻结地球上所有海洋?7号冰究竟是什么?自从此前北极能穿短袖新闻被报道之后,大家就开始担心起了海洋的情况,认为在这种趋势之下,它用不了多久就会大张旗鼓地来侵袭陆地,将人们建起的家园完全吞噬。这时有人就大开脑洞,指出想解决吴骊珠院士团队JACS综述多电子和多质子化学转化的光化学之旅导读近日,中科院理化所吴骊珠院士团队发表了一篇题为PhotochemistryJourneytoMultielectronandMultiprotonChemicalTransfo新风系统和空气净化器哪个更好,该选谁?对于新风系统和空气净化器这两个产品,应该很多人都听说过或者看到过,但具体有哪些区别就知道的不多,现在就针对它俩有哪些区别,以及我们该选择新风系统还是空气净化器,给大家总结如下。1适最强配最强Alienware发布RTX4090桌面新机型相信大家都知道,目前Nvidia推出了最新一代显示卡,就是RTX40系列,当中最强大的RTX4090将会在12日正式推出,而现在就有最新的消息,就是著名电竞品牌DellAlienw广州龙狮季前赛收获开门红林书豪首秀打得不多数据不错CBA季前赛同曦7981龙狮新快报讯记者高京报道昨天,备战新赛季的广州龙狮完成了球队的首场季前赛,结果队伍以8179险胜同曦。新援林书豪首次亮相,全场出战不到12分钟的他,拿到9分这样的一套家庭影院,未来十年也不会过时!智能高端,显大气这是一个科学技术飞速发展的时代,我们身边的所有事物都在快速更迭,家庭影院也不例外。在家庭影院刚兴起的时候,人们所用的设备有笨重的投影仪粗糙的幕布和半人高大的音响等而随着智能化时代的Cannon出任SunCable主席,领导世界上最大的太阳能和电池项目SunCable是世界上最大的太阳能和电池存储项目的开发商,最近任命科技亿万富翁迈克坎农布鲁克斯(MikeCannonBrookes)为该公司的新主席,这是对这家大型企业发展的最新新能源车市场大乱斗比亚迪太强势特斯拉也顶不住近日,新能源车股票大幅破位下跌,特斯拉也顶不住。从基本面看,新能源车市场格局出现重大的变化。比亚迪继续强势,已经远超特斯拉,也超越一众传统车企。新势力方面,蔚来汽车小鹏理想等表现不马斯克最近有点烦特斯拉市值一天蒸发5000亿,比亚迪可能反超马斯克的烦恼前不久刚刚再次蝉联世界首富不可一世的马斯克,最近遇到了几件烦心的事。先是马斯克针对俄乌冲突公开发表言论献计献策,他称为了尽快促进俄乌冲突的结束,可以在联合国的监督下,在3000元价位就等它,天玑9000下放中端机,性价比无敌国庆假期已经进入了尾声,相信大家也该收拾好心情准备工作了,手机厂商也是如此。在国庆节后,大多数厂商将开始迎战双十一了,按照往年的习惯,不少厂商都会选择在这个节点来推出相应的爆款来应比特币以太坊行情最新分析,利润完美抓取10。8日分析10月8日热点1。数据过去一周CircleUSDC流通量减少24亿美元2。UnstoppableDomains与Fantom集成以提供简化的加密交易3。HuobiGlobal控股股iPhoneTouchID回归仍无望?Apple测试后,为何决定不这么做?Apple自从在2017年拿掉TouchID,推出第一款FaceID的iPhoneX,往后的iPhone手机都是以FaceID辨识为主,不过一直以来都有流传萤幕下指纹解锁的流言蜚语如何避免WIFI被蹭?你家的网络会卡吗?你家的网速很慢吗?你是升级宽带还是更换路由器来解决呢?我们经常会因为家里网络慢,认为是宽带或者路由器问题导致,很容易忽略一点,就是被周边的人蹭网了。如果被蹭网,不绿茵信仰拯救心中的足球绿茵信仰虽然略有创新,但并没有超出传统足球游戏的内容。绿茵信仰的特别之处在于,整合了那些常规的玩法之后,形成了极其丰富的玩法。通过选择不同的踢球方式,球员可以体验到不同种类的足球乐原神如何看待原神中的五星武器狼的末路?矮子里面拔高个儿,优点是五星底子,并且是常驻武器。缺点是词条全被有效词条里最不行的大公鸡给占了不带班尼特不带拐大攻击队友时候有不错的表现,传统北斗队伍,不怎么带攻击拐的优菈队伍能有XGP每日游讯极品飞车新作泄露WildHearts实机预告极品飞车新作官宣前泄露距离极品飞车新作官宣只剩不到24小时,游戏的完整标题发售日期和截图已经在日本零售商网站上泄露。根据泄露内容结合早前其它小道消息,新作名为极品飞车Unbound(3)Golang导入本地包gomodule是Go1。11版本之后官方推出的版本管理工具,并且从Go1。13版本开始,gomodule将是Go语言默认的依赖管理工具。到今天Go1。14版本推出之后Gomodu摩托罗拉MotoE32印度新版发布IT之家10月5日消息,联想摩托罗拉在今年5月份于欧洲发布了MotoE32,配备紫光展锐T606芯片,90HzHDLCD屏幕,1600万像素后置摄像头,以及5000mAh电池。现在继续下滑?瑞银全球手机出货量约12。3亿部,只有苹果增长今年智能手机行业遭遇寒冬,过去几个月全球出货量持续下滑,国产品牌无一幸免,这种情况可能还会持续下去。瑞银证券发布最新预测,今年全球手机销量将下滑9,总出货量可能只有12。3亿部,除售价28。86万!续航610km,比亚迪汉EV算高性价比的新能源车型吗?在当下所有拥有新能源汽车的品牌当中,比亚迪的地位不可忽视,毕竟其销量占据了我国总需求的大头,称得上是新能源汽车的巨头,今天我们就用这款倍受有钱人喜爱的汉EV2022款创世版610K家庭要不要买些黄金买多少黄金的价值和价格走向,众说纷纭,买黄金能发财吗?不可能!买黄金能亏本吗?也不可能!买黄金能保值增值吗?一定程度!买黄金能避险吗?一定!一些经济学家和大牛们,经常在网上发布观点,无非海天味业发布声明中国基金报安曼最近,海天酱油被海外网友发现中外标签不一致,被推上风口浪尖。10月5日,海天味业发布声明称,食品添加剂广泛应用于各国的食品制造中,各企业按照各国标准和产品特性合法合规
全国首单投资者保护机构股东代位诉讼落地加购董责险仍需强监管日前,上海金融法院裁定准予原告中证中小投资者服务中心有限责任公司(以下简称投服中心)代上海大智慧股份有限公司(以下简称大智慧)诉其董事监事高级管理人员张某虹王某王某红洪某四名被告损2023年12月份规模以上工业增加值增长2。412月份,规模以上工业增加值同比实际增长2。4(增加值增速均为扣除价格因素的实际增长率)。从环比看,2月份,规模以上工业增加值比上月增长0。12。分三大门类看,12月份,采矿业增加70城房价总体上升楼市回正?楼市企稳可期一系列稳楼市政策持续显效,房地产市场企稳迹象不断增多。国家统计局数据显示,2月房地产开发投资商品房销售面积等指标同比降幅明显收窄,70城房价环比上涨城市大幅增多。数据向左手腾势,右手F,比亚迪这是要把ABB逼到穷途末路?进入3月,关于比亚迪F品牌的消息越来越多。F品牌首款产品将聚焦越野领域,计划于年内推出。未来F品牌的产品矩阵将涵盖跑车越野轿跑等多个品类。新品牌预计在2023年内发布,并独立于现有晖致产品销售收入分析(2018年至2022年)晖致销售收入地域分布2020年辉瑞将其旗下Upjohn和Mylan合并,合并后的公司更名为晖致。Mylan被认定为是会计上的收购方,因此,2020年及以前年度的财务数据为Mylan原油暴跌扭转调价预期!成品油或迎年内第二跌中新经纬3月17日电(吴晓薇)3月17日24时,国内汽柴油价格将迎来调价的时间窗口。在经过连续两轮油价调整搁浅后,由于最近国际油价连续大跌,并创下近15个月来的新低,国内油价也从原抄底银行的机会真的来了吗近期,硅谷银行破产事件在美国银行体系持续发酵,国内银行板块也受到波及。一夕之间,大家似乎突然发现,原来银行是如此脆弱,像硅谷银行,美国第16大银行,一直被投资者津津乐道的特色银行,大球泥三获高企认定3月13日,湖南大球泥瓷艺集团有限公司领到新鲜出炉的高新技术企业证书和牌匾。这是大球泥瓷艺自2012年成立以来,连续第三次被评定为高新技术企业。国家对高新技术企业的认定,有严格的审塔里木油田迈入九千米级油气勘探开发新阶段来源人民日报本报乌鲁木齐3月15日电(记者李亚楠)记者从中国石油塔里木油田获悉位于塔克拉玛干沙漠腹地富满油田的果勒3C井近日顺利完钻,井深达9396米,标志着塔里木油田正式迈入90资讯上汽集团自营航线首发起航,首批千辆MG品牌新车出海文懂车帝原创李德喆懂车帝原创行业懂车帝从上汽集团官方获悉,3月15日,上汽集团宁德墨西哥国际自营航线首发起航,上汽旗下运载量最大的汽车滚装船安吉凤凰号搭载首批千辆MG品牌新车,从福复星系百亿交易AB面清仓南钢联合留下新能源公司,沙钢入主仍存变数?本文来源时代周报作者黄嘉祥复星国际(00656。HK)资本版图生变在即,自其宣布出售南京南钢钢铁联合有限公司(下称南钢联合)股权5个月后,这项超百亿元的交易正式签订协议。3月14日