Qt Core 模块

由于这个模块太基础了,我反而没有看到有文章详细的写过。感觉这不太应该啊。core模块由如下几方面组成:

  1. 元对象

  2. 属性系统

  3. 强大的signal/slot机制。

  4. 对象树

  5. 多线程

  6. IO、Container、状态机

  7. 事件系统

  元对象系统不得不提了,它是Qt 各种功能的基石。准确来说,若使用Qt元对象系统,那其实是在使用比C++ 更高级的一门语言,它必须要求moc编译器的支持。这个编译器的输出是C++代码。moc编译器只处理 h文件,而且是只包含一个含有 Q_OBJECT 的class 的 h 文件。比如说MyClass.h,使用moc生成一个 moc_MyClass.cpp,再联合MyClass.cpp,这三个文件,形成一个C++ build单元,提供一个完整的 qt metaobject class的能力。

The meta-object system is based on three things:

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.

元对象系统主要体现在QObject、QMetaObject两个class上。只要是基于QObject的class,都能通过dynamic_cast来判断子类型了。即使是当前编译器flag并不支持RTTI。这里就不讨论moc编译器,留在单独的文章中总结。

    属性系统是基于元对象系统的。仍然是利用moc 来实现。其实,就是一种本该用户手写C++代码的方式,现在可以使用属性系统的写法,直接在规范的指引下,在工具的帮助下,生成这些代码。Q_PROPERTY() 这个 macro是核心,此种属性是compile-time属性。这里也体现了一些RTTI的特征,因为我们可以直接在程序动态运行时遍历一个对象(不是class)的属性。另外一方面,就是动态属性了(Dynamic Properties),也就是使用QObject::setProperty() 在程序动态运行时给对象添加的属性。不管时compile-time,还是run-time属性,对于编程来讲,都提供了不少便利性。请参看链接[5]。

    signal/slot机制 可以说是Qt备受工程师喜爱的最主要原因。signal/slot最大的特点是 在语言(编译器)层面实现的解耦,实在了不得。这相当于让C++语言拥有了更动态的、高级的表述能力。如果没有它,我们只能通过interface并子类的方式实现功能。项目中,会多出来一堆的class。

    对象树,这个特点,最重要的还是体现在UI上,我们只管new 各种 UI对象,却并不关心delete。只要保证好对象有parent,就基本上不会发生内存泄漏的问题。我们关闭widget时,Qt对象树就会自动级联的删除ui对象。如果没有“对象树”这个核心特点,我们的代码里,将会充满了各种delete,而且,容易出错。

    多线程。这个就不多说了,Qt 提供了对OS线程很好的封装。IO、container、状态机 也没有什么好说的,Qt提供了非常好的工具类。这些工具类,多数是为了UI功能考虑设计的,所以,不要抱怨接口不太好。

 事件系统。这个得着重说一下了。不管是console程序,还是ui程序,Qt都提供了事件循环的方式。对于console程序,我们需要QCoreApplication。对于UI程序,我们需要使用QGuiApplication。前面说过,Qt5把GUI模块拆分成GUI、widget两个模块。若我们的程序不需要QWidget的功能,就可以仅仅使用QGuiApplication。例如,只需要一个原生窗口,需要OpenGL/DX来实现的三维游戏。一旦我们的程序使用了QWidget的功能,那么,就需要使用QApplication这个子类。 

It initializes the application with the user's desktop settings such as palette(), font() and doubleClickInterval(). It keeps track of these properties in case the user changes the desktop globally, for example through some kind of control panel.

It performs event handling, meaning that it receives events from the underlying window system and dispatches them to the relevant widgets. By using sendEvent() and postEvent() you can send your own events to widgets.

It parses common command line arguments and sets its internal state accordingly. See the constructor documentation below for more details.

It defines the application's look and feel, which is encapsulated in a QStyle object. This can be changed at runtime with setStyle().

It specifies how the application is to allocate colors. See setColorSpec() for details.

It provides localization of strings that are visible to the user via translate().

It provides some magical objects like the desktop() and the clipboard().

It knows about the application's windows. You can ask which widget is at a certain position using widgetAt(), get a list of topLevelWidgets() and closeAllWindows(), etc.

It manages the application's mouse cursor handling, see setOverrideCursor()

  因为 QApplication管理了太多的职责,所以,它基本上需要在其他UI相关的对象创建之前被创建出来。最终,app.exec() 运行后,Qt GUI程序就进入了UI主线程循环。我们是无法再主动控制流程了,除非中断Qt事件循环。我们可以选择各种各样的事件驱动方式,例如接受OS事件并反馈,也可以使用定时器,主动刷新事件循环。由于单纯的事件处理、UI更新占用系统负载较低,所以,一般开发者都不关心这部分的差别。Qt事件系统主要的职责便是,把事件准确的传递给目标,并根据用户更新ui的操作,重新绘制部分ui。当然了,如何计算widget 覆盖,如何更新部分widget渲染结果,当然是稍微复杂一些的内容了。

  如果我们想要使用好Qt,那么,官方文档是不能不读的。而且,这也是效率最高的方式。虽然是英文的,但是,内容及其简单,相信不用过英语四级都能无障碍阅读文档。所以,也没有人系统的做过翻译。

  1. https://doc.qt.io/qt-5/qtcore-index.html

  2. https://doc.qt.io/archives/qt-4.8/metaobjects.html

  3. https://doc.qt.io/qt-5/moc.html

  4. https://zhuanlan.zhihu.com/p/43348546 

  5. https://doc.qt.io/qt-5/properties.html

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值