QtCore概述

71 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

前言

偶然间看到QtCore库的引入,好奇它是做什么的?原来它是Qt的核心内容,也是最基本的模块。故仔细的整理一下,加深对Qt的理解,也便于开发。

==QtCore是Qt的最基础的模块,其他模块的基石,它体现了区别于其他开发平台的特有的内容。==

@TOC

QtCore也就是Qt的核心部分,围绕官方介绍可以理解为以下的一些特性。所以理解QtCore也就是理解以下的特性。

1、信号与槽(Signals&Slots)

首先谈谈C++的缺点,它拥有继承、派生和聚合,但是它没有提供对象间通信和共享数据的方式。虽然指针可以交换数据,但是资源的生命期管理是个很大的麻烦,大型C++的GUI项目在管理大量原生指针的时候很难不出错。Qt作为大型GUI项目的Framework,故==创造了信号与槽(Signals&Slots),它使用起来也非常的简便,也是最为核心的内容==。同时它依靠 Qt 的元对象系统以及 moc工具 实现。关于信号槽的使用在此不再赘述。

2、元对象系统(The Meta-Object System)

它为Qt提供了信号与槽机制、实时类型信息和动态属性系统(The Property System)。元对象系统主要基于三个东西:Object类、Q_OBJECT、moc。核心是MOC(Meta-Object Compiler ),元对象编译器,它对C++本身实现了扩展。 详情可以参考:Qt元对象系统解析(一)

注:Qt “扩展”了标准 C++。所谓“扩展”,实际是在使用标准 C++ 编译器编译 Qt 源程序之前,Qt 先使用一个叫做 moc(Meta Object Compiler,元对象编译器)的工具,先对 Qt 源代码进行一次预处理(注意,这个预处理与标准 C++ 的预处理有所不同。Qt 的 moc 预处理发生在标准 C++ 预处理器工作之前,并且 Qt 的 moc 预处理不是递归的。),生成标准 C++ 源代码,然后再使用标准 C++ 编译器进行编译。

3、对象模型(Object Model)

可查询和可设计的对象属性。使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活。比如在 GUI 界面编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可不想把子窗口用代码一个个去析构。

注:RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。

4、对象树(Object Trees&Ownership)

层次化的可查询的对象树,我们常用相关的函数体现在QObject::setParent()、QObject::findChild()、QObject::findChilren()这几个函数上。这种树形结构保持了众多对象之间的严密的父子、逻辑关系。

Qt 引入对象树的概念,在一定程度上解决了内存问题。当一个QObject对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。Qt 保证的是,任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有QObject会被 delete 两次,这是由析构顺序决定的。

5、智能指针(QPointer)

智能指针(QPointer),在对象析构之后自动设为 0,防止野指针。用智能指针(QPointer)的自然方式拥有对象所有权(Ownership)。

总结:

本文主要参考QtCore 5.15官方介绍 及对知乎问题:如何才能学到Qt的精髓?, Qt元对象系统解析 Qt对象模型 的一个整理 帮助理解Qt的基础核心模块QtCore。

目前正在用Qt做桌面应用,很多东西都是直接拿来用,思考问题也还没有太深,所以这里记录一下有待思考和学习的问题: 为何 Qt 使用 Moc 实现信号槽——听说Qt又笨重又慢? Qt中moc的作用 解析Qt元对象系统(一) 概述 解析Qt元对象系统(二) Q_OBJECT Qt 之对象树与所有权

事作于细,博主资质尚浅,但也希望写出更好的文章。恐有错误之处,欢迎指正~