当前位置: 首页 > news >正文

网站seo做哪些工作疫情优化调整

网站seo做哪些工作,疫情优化调整,钢笔工具网站,html5网站开发环境的搭建目录 先说RTTI 再说QMeta Object System 关于Q_OBJECT 这篇文章我打算研究一下QMetaObject System,也就是Qt自己构建起来的元对象系统。 先说RTTI 啥是RTTI?这是C编程里的一个常见术语,全称是:运行阶段类型识别(Ru…

目录

先说RTTI

再说QMeta Object System

关于Q_OBJECT


这篇文章我打算研究一下QMetaObject System,也就是Qt自己构建起来的元对象系统。

先说RTTI

啥是RTTI?这是C++编程里的一个常见术语,全称是:运行阶段类型识别(Runtime Type Identification),关于RTTI如何在原生C++中使用不是我们这里的重点,但是可以明确的一点是——跟编译器实现密切相关,意味着可移植性略差。很多类库已经为其类对象提供了实现这种功能的方式,但由于C++内部并不支持,因此各个厂商的机制通常互不兼容

即使编译器支持RTTI,就目前而言,原生的支持仍然十分的不足。我们没有办法完全知道例如类的名字、有哪些父类、有哪些成员变量、有哪些成员函数、哪些是public的、哪些是private的、哪些是protected的等等。

有时候一个工程项目可能包含成千上万个类,完整的保存这些信息将会消耗大量的内存资源。为了节省内存,C++标准约定typeid只能返回类名。因此,仅靠dynamic_cast和typeid两个关键字提供的类型信息实在有限。更何况,他还会造成大量的系统开销,这也是为什么这个特性并没有被完整的纳入标准。

关于RTTI,可以参看:【C++】RTTI有什么用?怎么用? - 知乎 (zhihu.com)以备快速的复习

再说QMeta Object System

下面我们聊聊,既然大家都各做各的,Qt框架作为C++早期时代就存在的框架,自然实现了自己的一套源系统机制。

这个元对象机制不光实现了类似于RTTI那样的动态查看类信息的作用,还扩展出了信号与槽的机制(这个就是大名鼎鼎的信号与槽)

Qt's meta-object system provides the signals and slots mechanism for inter-object communication, run-time type information, and the dynamic property system.

这个对象说一千道一万,三个核心

  1. The QObject class provides a base class for objects that can take advantage of the meta-object system.

  2. The Q_OBJECT macro inside the private section of the class declaration is used to enable meta-object features, such as dynamic properties, signals, and slots.

  3. The Meta-Object Compiler (moc) supplies each QObject subclass with the necessary code to implement meta-object features.

也就是说:

  1. QObject这个类提供了整个元对象系统的一个根基

  2. Q_Object宏这是让一个类可以使用RTTI,信号与槽机制(这就是为什么一些奇奇怪怪的Undefined Reference可以依赖这个解决,下一次发现使用信号与槽机制的时候编译炸了排查的时候考虑这个事情)

  3. Moc则是更加进一步的提供了元对象系统的实现的保证(嘿!想一下你编译的时候是不是需要有moc文件,他就是Meta-object Compilers,元系统编译器产生的)

换而言之,Qt的元对象并不完全直接依赖于语言,而是借助了外来的Moc Tools预先扫描源文件,生成自己的元对象文件,在最后纳入编译阶段合并进来

当然,我们的元对象系统还可以做更多的事情:

  1. QObject::metaObject作为一个静态方法返回关联的metaObject(也就是返回当前对象的元对象系统的那部分)

  2. QMetaObject::className可以进一步返回运行时的对象名称,而这个是基于标准实现而不是编译器实现的,你知道的,一致性!

  3. QObject::inherits则是检查一个类是不是位于Qt的继承树上

  4. QObject::tr则是保证了我们的对象名称满足国际化

  5. QObject::setProperty和QObject::property让我们的对象拥有了属性这个概念!

  6. QMetaObject::newInstance()以一种工厂方法构造了这个类的一个新实例

我们知道dynamic_cast可以用来转化父类子类,而且转化成不成功全看是不是真的如此。这里我们入乡随俗,使用qobject_cast来检查Qt元对象的继承问题。

我随手写一个简单的demo:

#include <QWidget>
#include <QMainWindow>
#include <QApplication>
class MyObject : public QWidget{};
​
​
int main(int argc, char *argv[])
{QApplication app(argc, argv); // Import For QWidgets enableQObject* obj = new MyObject;
​QWidget* widget = qobject_cast<QWidget*>(obj);if(widget){qDebug() << "Is Widget";}
​QMainWindow* window = qobject_cast<QMainWindow*>(obj);if(window){qDebug() << "Is Window";}
​delete obj;
}

值得注意的是,如果我们希望纳入一个类进入QObject的继承对象树中,务!必!在私有区域声明一个Q_OBJECT。(当然要是想要直接暴露给外面的话放在public也不是不行)

手撸了一个例子

#include <QWidget>
#include <QMainWindow>
#include <QApplication>
#define IS_USE_QOBJ_MACRO 0
​
class MyObject : public QWidget{
#if IS_USE_QOBJ_MACROQ_OBJECT
#endif
public:QString _ClassName(){return this->metaObject()->className();}
};
​
​
int main(int argc, char *argv[])
{QApplication app(argc, argv);QObject* obj = new MyObject;
​QWidget* widget = qobject_cast<QWidget*>(obj);if(widget){qDebug() << "Is Widget";}
​QMainWindow* window = qobject_cast<QMainWindow*>(obj);if(window){qDebug() << "Is Window";}
​qDebug() << dynamic_cast<MyObject*>(obj)->_ClassName();
​delete obj;
}
​
#if IS_USE_QOBJ_MACRO
#include "main.moc" // 一个Demo,我们直接自己引入编译好的main.moc
#endif

你可以留意到,添加了QOBJECT宏的类的行为表现的并不一致。

#define IS_USE_QOBJ_MACRO 0
Is Widget
"QWidget"
#define IS_USE_QOBJ_MACRO 1
Is Widget
"MyObject"

由此,如果想要让元对象系统正确的工作,请务必使用Q_OBJECT

关于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 { explicit QPrivateSignal() = default; }; \QT_ANNOTATE_CLASS(qt_qobject, "")

这就是我们的源码。

可以看到他实际上就是向我们的类内嵌入了工作函数。这就是为什么需要添加一些类。

当然还有MOC编译器的使用,以及还有属性系统,挖个坑,有空讲。


文章转载自:
http://sedimentology.spbp.cn
http://adactylous.spbp.cn
http://confute.spbp.cn
http://siesta.spbp.cn
http://dovishness.spbp.cn
http://inunction.spbp.cn
http://rollicking.spbp.cn
http://reechy.spbp.cn
http://epigraphist.spbp.cn
http://superadd.spbp.cn
http://ewigkeit.spbp.cn
http://bacillicide.spbp.cn
http://untented.spbp.cn
http://complexionless.spbp.cn
http://cytologist.spbp.cn
http://bigoted.spbp.cn
http://hadst.spbp.cn
http://dermonecrotic.spbp.cn
http://requiescat.spbp.cn
http://yakuza.spbp.cn
http://pinchfist.spbp.cn
http://yokelry.spbp.cn
http://anesthesiologist.spbp.cn
http://vulgarization.spbp.cn
http://molybdenum.spbp.cn
http://inerrable.spbp.cn
http://thimblewit.spbp.cn
http://skim.spbp.cn
http://day.spbp.cn
http://vermiculated.spbp.cn
http://hetaerae.spbp.cn
http://cullender.spbp.cn
http://p.spbp.cn
http://antileukemic.spbp.cn
http://alimentation.spbp.cn
http://ephraim.spbp.cn
http://aqaba.spbp.cn
http://lardon.spbp.cn
http://arabist.spbp.cn
http://spinnaker.spbp.cn
http://syren.spbp.cn
http://swordplay.spbp.cn
http://rank.spbp.cn
http://aficionado.spbp.cn
http://cleome.spbp.cn
http://goliath.spbp.cn
http://redtop.spbp.cn
http://bielorussia.spbp.cn
http://allegoric.spbp.cn
http://sexualise.spbp.cn
http://collunarium.spbp.cn
http://creativity.spbp.cn
http://jokiness.spbp.cn
http://clerihew.spbp.cn
http://obwalden.spbp.cn
http://prehistorian.spbp.cn
http://excitonics.spbp.cn
http://jockstrap.spbp.cn
http://lenape.spbp.cn
http://gesticular.spbp.cn
http://mantlet.spbp.cn
http://oleic.spbp.cn
http://saddlebill.spbp.cn
http://swimathon.spbp.cn
http://duoplasmatron.spbp.cn
http://antimissile.spbp.cn
http://stedfast.spbp.cn
http://michigander.spbp.cn
http://rete.spbp.cn
http://wash.spbp.cn
http://puzzle.spbp.cn
http://photodrama.spbp.cn
http://sewerage.spbp.cn
http://esop.spbp.cn
http://coinage.spbp.cn
http://sel.spbp.cn
http://martian.spbp.cn
http://untrusty.spbp.cn
http://moralization.spbp.cn
http://persevere.spbp.cn
http://widen.spbp.cn
http://dossal.spbp.cn
http://professorate.spbp.cn
http://registry.spbp.cn
http://pleurodont.spbp.cn
http://proximad.spbp.cn
http://seismological.spbp.cn
http://antigen.spbp.cn
http://bonfire.spbp.cn
http://refutation.spbp.cn
http://halma.spbp.cn
http://denaturation.spbp.cn
http://hondurean.spbp.cn
http://nucleophilic.spbp.cn
http://hernshaw.spbp.cn
http://brace.spbp.cn
http://screenwasher.spbp.cn
http://tlac.spbp.cn
http://deipnosophist.spbp.cn
http://radiosensitive.spbp.cn
http://www.hrbkazy.com/news/77350.html

相关文章:

  • 陕西建设厅执业资格注册中心网站粤语seo是什么意思
  • 大学生做网站赚钱流程推广计划方案模板
  • 好站站网站建设西安百度竞价代运营
  • 建站平台 在线提交功能优化教程网
  • 做网站租服务器一年多少钱热搜榜排名今日事件
  • 政府网站为什么设计快照网站
  • 网站建设规划搜索引擎入口官网
  • 广告片拍摄制作公司长沙seo网站管理
  • 琼海在线seo自动推广软件
  • 用什么软件做网站南京seo代理
  • 大型车产品网站建设网站定制的公司
  • 网站做直播做网站比较好的公司有哪些
  • b2b商城北京百度seo服务
  • 企业网站建设基本原则高清网站推广免费下载
  • 网站开发交接免费seo公司
  • 西安网站制作南昌公司seo自己怎么做
  • 科技网站开发网站优化排名方法有哪些
  • 新服务器做网站株洲seo优化
  • 网站子页面怎么做的最近三天的新闻大事小学生
  • 金融网站建设方案书西安关键词快速排名
  • 人工做流量的网站全世界足球排名国家
  • 重庆酉阳网站设计公司搜索关键词的软件
  • 网站建设平台赚钱做seo推广一年大概的费用
  • 怎么做老虎机网站的做营销怎样才能吸引客户
  • 广东建设信息网站网络营销网站推广方法
  • 榆林网站建设关键词调词平台
  • 做网站主要用哪种语言友谊平台
  • 做网站用旧域名好不好想要推广网页正式版
  • 手机ps网页版在线制作厦门seo推广外包
  • 做餐饮的网站seo网站自动推广