Qt and C++

Qt是QML与JavaScript的C++扩展工具包。有许多语言与Qt绑定,但是由于Qt是由C++开发的,C++的精神贯穿了整个Qt。在这一节中,我们着重从C++的角度介绍Qt,使用C++开发的本地插件来了解如何更好的扩展QML。通过C++,可以扩展和控制提供给QML的执行环境。

这章将讲解Qt,正如Qt所要求的一样,需要读者有一定的C++基础知识。Qt不依赖于先进的C++特性,我认为Qt风格的C++代码可读性非常高,所以不要担心你的C++方面比较差。

从C++的角度分析Qt,你会发现Qt通过内省数据的机制实现了许多现代语言的特性。这是通过使用基础类QObject实现的。内省数据,源数据,类运行时的数据维护。原生的C++是不会完成这些事情的。这使得动态查询对象信息,例如它们的属性成为可能。

Qt使用源对象信息实现了信号与槽的回调绑定。每个信号能够连接任意数量的槽函数或者其它的信号。当一个信号从一个对象实例从发送后,会调用连接信号的槽函数。发送信号的对象不需要知道接收槽对象的任何信息,反之亦然。这一机制可以创建复用性非常高的组件,并减少组件之间的依赖。

内省特性也用于创建动态语言的绑定,使得QML可以调用暴露的C++对象实例,并且可以从JavaScript中调用C++函数。除了绑定Qt C++, 绑定标准的JavaScript也是一种非常流行的方式,还有Python的绑定,叫做PyQt。

除了这些核心概念,Qt可以使用C++开发跨平台应用程序。Qt C++在不同的操作系统上提供了一套平台抽象,允许开发者专注于手上的任务,不需要你去了解如何在不同的操作系统上打开一个文件。这意味着你可以在Windows,OS X和Linux重复编译相同的代码,由Qt去解决在不同平台上的适配问题。最终保持本地构建的应用程序与目标平台的窗口风格上看起来一致。随着移动平台的桌面更新,Qt也提供相同的代码在不同的移动平台上编译,例如IOS,Android,Jolla,BlackBerry,Ubuntu Phone,Tizen。

这样不仅仅是代码可以重用,开发者的技能也可以重用。了解Qt的团队比只专注于单平台特定技能的团队可以接触更多的平台,由于Qt的灵活性,团队可以使用相同的技术创建不同平台的组件。

Qt and C++ - 图1

对于所有平台,Qt提供了一套基本类,例如支持完整unicode编码的字符串,链表容器,向量容器,缓冲容器。它也提供了目标平台的通用主循环抽象和跨平台的线程支持,网络支持。Qt的主旨是为Qt的开发者提供所有必须的功能。对于特定领域的任务,例如本地库接口,Qt也提供了一些帮助类来使得这些操作更加简单。