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

QtD指针和Q指针及使用

1月9日 九阙忬投稿
  阅读Qt的源代码的时候,我们经常看QD、QQ、QDECLAREPRIVATE、QDECLAREPUBLIC这几个宏,这几个宏是干什么用的呢?其实这几个宏就是实现D指针和Q指针的宏,D指针在Qt的源码中大量使用,根本目的在于解决二进制兼容问题。至于什么二进制兼容,可以查阅其他资料,这里只讲Qt中是怎么实现的。1。D指针及Q指针
  我们先建一个Test类和私有类TestPrivate类,在Test类中添加dptr成员,在TestPrivate中添加qptr成员。头文件如代码1所示:ifndefTESTHdefineTESTHincludeQScopedPointerclassTestPclassTest{QDECLAREPRIVATE(Test)public:Test();virtualTest();voidsetValue(intv);intvalue()protected:QScopedPointerTestP};endifTESTH
  代码1
  源文件如代码2所示:includetest。hclassTestPrivate{QDECLAREPUBLIC(Test)public:T};Test::Test():dptr(newTestPrivate){dptrmvalue10;}Test::Test(){}voidTest::setValue(intv){QD(Test);if(dmvaluev){}}intTest::value()const{QD(constTest);}
  代码2
  在上面代码中我们使用了QD、QDECLAREPRIVATE、QDECLAREPUBLIC宏,这个几个宏如代码3所示(参看qglobal。h)templatetypenameTstaticinlineTqGetPtrHelper(Tptr){}templatetypenameWrapperstaticinlinetypenameWrapper::pointerqGetPtrHelper(constWrapperp){returnp。data();}defineQDECLAREPRIVATE(Class)inlineClassPrivatedfunc(){returnreinterpretcastClassPrivate(qGetPtrHelper(dptr));}inlineconstClassPrivatedfunc()const{returnreinterpretcastconstClassPrivate(qGetPtrHelper(dptr));}friendclassClassPdefineQDECLAREPUBLIC(Class)inlineClassqfunc(){returnstaticcastClass(qptr);}inlineconstClassqfunc()const{returnstaticcastconstClass(qptr);}friendclassCdefineQD(Class)ClassPrivateconstddfunc()defineQQ(Class)Classconstqqfunc()
  代码3
  然后我们可以看到展开之后的头文件如代码4所示:ifndefTESTHdefineTESTHincludeQScopedPointerclassTestPclassTest{inlineTestPrivatedfunc(){returnreinterpretcastTestPrivate(dptr。data());}inlineconstTestPrivatedfunc()const{returnreinterpretcastconstTestPrivate(dptr。data());}friendclassTestPpublic:Test();virtualTest();voidsetValue(intv);intvalue()protected:QScopedPointerTestP};endifTESTH
  代码4
  展开之后的源文件如代码5所示:includetest。hclassTestPrivate{inlineTestqfunc(){returnstaticcastTest(qptr);}inlineconstTestqfunc()const{returnstaticcastconstTest(qptr);}friendclassTpublic:T};Test::Test(){dptr。reset(newTestPrivate);dptrmvalue10;}Test::Test(){}voidTest::setValue(intv){TestPrivateconstddfunc();if(dmvaluev){}}intTest::value()const{constTestPrivateconstddfunc();}
  代码5
  展开之后我们就可以清晰地看到这几个宏做了什么。以QObject为例,在QObject的源代码中有如代码6所示,在构造函数中实现的dptr和qptr的初始化,跟上面的Test类似:头文件中(qobject。h)classQCOREEXPORTQObject{protected:QObject(QObjectPrivatedd,QObjectparentQNULLPTR);protected:QScopedPointerQObjectD}源文件中(qobject。cpp)QObject::QObject(QObjectparent):dptr(newQObjectPrivate){QD(QObject);}
  代码6D指针和Q指针使用
  假如我们的类是从Qt的类继承下来的,以QObject和上面的Test类为例,由于QObject中已经有了dptr成员了,而且Qt的类都会有一个类似QObject(QObjectPrivatedd,QObjectparentQNULLPTR)这样的受保护的构造函数,现在需要做的就是Test继承QObject、TestPrivate继承QObjectPrivate、在Test的构造函数中调用QObject(QObjectPrivatedd,QObjectparentQNULLPTR)这种构造函数。需要注意的是QObjectPrivate是在qobjectp。h头文件中,如果要包含这个头文件,我们需要在pro中添加QTcoreprivate,然后在代码中添加include。
  修改之后的头文件如代码7所示:ifndefTESTHdefineTESTHincludeQObjectclassTestPclassTest:publicQObject{QOBJECTQDECLAREPRIVATE(Test)public:Test(QObjectparentnullptr);virtualTest();voidsetValue(intv);intvalue()};endifTESTH
  代码7
  修改之后的源文件如代码8所示,注意构造函数的变化和TestPrivate继承QObjectPrivate:includetest。hincludeprivateqobjectp。hclassTestPrivate:publicQObjectPrivate{QDECLAREPUBLIC(Test)public:};Test::Test(QObjectparent):QObject((newTestPrivate),parent){QD(Test);dmvalue10;}Test::Test(){}voidTest::setValue(intv){QD(Test);if(dmvaluev){}}intTest::value()const{QD(constTest);}
  代码8
  假如我们的类是类似最开始Test的那种,就像代码1和代码2那样实现即可,另外如果我们的d指针不是dptr而是像mptr这样该怎么办?其实Qt还有另外一个宏QDECLAREPRIVATED,只需要把QDECLAREPRIVATE(Test)替换成QDECLAREPRIVATED(mptr,Test)。
  顺便讲一下QPRIVATESLOT这个宏,这个宏可以把私有类的成员函数注册共有类的槽函数。还是以Test为例,在头文件中添加代码9:private:QPRIVATESLOT(dfunc(),voidqtimeout())
  代码9
  在源文件中TestPrivate中添加了一个mtimer和函数qtimeout,连接timer的timeout信号,修改之后代码如代码10所示,注意添加最后一行的includemoctest。cpp,如果不添加的话会导致链接错误:无法解析的外部符号。classTestPrivate:publicQObjectPrivate{QDECLAREPUBLIC(Test)public:QTvoidqtimeout();};Test::Test(QObjectparent):QObject((newTestPrivate),parent){QD(Test);dmvalue10;dmtimernewQTimer(this);connect(dmtimer,SIGNAL(timeout()),this,SLOT(qtimeout()));dmtimerstart(1000);}voidTestPrivate::qtimeout(){qDebug()}includemoctest。cpp
  代码10
  如果Test类可以让其他类继承,使用D指针的话,需要把TestPrivate的声明放到testp。h中去,就像qobjectp。h那样,继承类就可以使用includetestp。h包含TestPrivate类了。当然还需要为Test添加一个受保护的构造函数Test(TestPrivatedd,QObjectparentQNULLPTR)。感兴趣的小伙伴可以自己实现一下。看看有没有什么问题。
  好了,关于D指针和Q指针就讲到这里了,大家有什么想知道了,可以在评论区告诉我,有空的时候帮大家整理出来。
投诉 评论 转载

麒麟9905G打王者这种主流游戏能撑几年?嗯,回答本行业话题,希望我的回答对您有帮助!在回答这个问题之前,先说一下目前手机芯片的大概情况。目前最强的手机芯片是苹果的A系列芯片,其次是高通的骁龙高端,最后才是华为的……黑掉特斯拉FSD!乌克兰黑客这样完美运行特斯拉自动驾驶来源:teslarati编辑:好困【新智元导读】近日,一位乌克兰的网友表示自己成功地开启了特斯拉并没有在欧洲上线的FSD。莫非是黑进了特斯拉的系统?自动驾驶的主流向……为什么不能把互联网交易用火车和马车比较国内一提到互联网交易,网络购物。总有人喜欢用火车取代马车的例子来比较。众所周知。火车的速度,以及运载力不是马车能比较的,火车取代马车是生产力的提升,反观电商,网络平台交易是什么……浙江桐庐有哪些旅游景点?桐庐隶属杭州市,距离杭州市区一般一个半小时左右车程,是杭州周边旅游胜地。一般游玩都可以控制在一天之内,是周末自驾游的不错选择。下面飞小编就为大家推荐3处桐庐比较有特色的景点吧!……中国能否研发量子计算机从而实现对美国芯片的弯道超车?不要老说弯道超车了,事到如今谁见到了所谓的弯道超车了?量子通讯、计算机等目前都还是基础理论阶段,到实际应用还很远,根本就是远水不解近渴的事。川普既然敢对中国那么多家高科技公司舞……秋冬盲目进补不可取,宝宝脾好才能吸收好近期,全国迎来了大幅度的降温,寒意骤袭,儿科门诊、急诊又到了高度繁忙的时候。冬季是各种儿童疾病的高发季节,除了感冒、发热、咳嗽等常见病症,消化系统疾病也是高频出现,消化功能紊乱……盘点被iPhone带坏的设计,有些早已改正,但还有厂商执迷不在跟风这条道路上,安卓厂商可以说玩得不亦乐乎,行业大佬怎么搞,咱们就跟着干就行,至少不会出错,错了也不怪我们,毕竟还有iPhone在前面抗刀,而回顾这些年被iPhone带坏的设……使用Prometheus和Grafana搭建SpringBo最近公司项目介绍的时候看到了类似监控系统的展示页面,比如资源利用、GC次数、Kafka生产消费等,清晰明了,页面十分酷炫。这是怎么实现的呢??原来是Grafana!!这么……QtD指针和Q指针及使用阅读Qt的源代码的时候,我们经常看QD、QQ、QDECLAREPRIVATE、QDECLAREPUBLIC这几个宏,这几个宏是干什么用的呢?其实这几个宏就是实现D指针和Q指针的……字节终止招聘阿里涉事男员工选人,要选对人一、回顾阿里807事件八月第一个周末,阿里女员工被高管侵犯一事持续发酵,引起社会各界高度关注。直到8月9日凌晨,阿里巴巴董事会主席兼CEO张勇在阿里内网公布了女员工被侵犯……对代码不感冒,我应该怎么办?1、理解技术债务技术债务就像信用卡一样,会有很高的利息率,时间越长,修复所花的代价就越大,程序员对这个要有深刻的认识。同时团队应该培养一种保证设计质量的文化,应当鼓励重构……iPhone手机不同版本iOS系统的功能技巧分享新生活转发评论点赞点赞关注我,查看更多不同系统下iPhone手机的功能介绍。1、重按键盘空格键可以移动光标、长按文本会出现选择全选,也可以移动光标。2、我们在删……
Linuxcrontab命令跌至1289元,1亿像素4820mAh,小米爆款5G千元机加华为麒麟960怎么样?这4种家电,越贵智商税越多,满足基本功能,普通款就足够了资本撤退?滴滴失宠?正式入场618,抖音布局电商的第一场大战联想!未来如何联想?自动驾驶商业运营试点来了!百度Apollo完成首单付费组装一台设计用的电脑,平时用3DMAX软件,PS软件,请问有沈万豪4。20晚间比特币以太坊行情分析及操作建议耳闻目睹电脑之怪故障亲身体验排障之奇路数全球手机出货量下降6。7,三星大跌苹果大涨

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