Qt学习前言

最后都变了- 提交于 2020-01-24 22:44:37

奇趣科技(Trolltech)是一家什么样的公司?答:QT开发库的母公司。

  完全基于Linux真正成长起来的公司仍然寥寥无几,而奇趣试图在开源里找到一条独特的发展之路。

  David Almstrom,一位头发卷曲的瑞典人,奇趣科技(Trolltech)中国区首席代表,再次见到是在他那间中国风极为浓厚的办公室。在轻快的背景音乐下,摄影记者为他摆拍照片, “拍这样的照片,我需要音乐做背景,它可以给我灵感,让我更加上镜。”办公室里的中国味来自于David为自己选中的那个中式、刻有细致古式花纹的文件柜,和一张简单的黑桃木色长方形办公桌。而办公桌背后的两个足有两米高的彩色背板,是他两个女儿送的绘画作品,清新而明快。

  这家总部位于挪威奥斯陆,1994年成立的公司,与其他软件开发公司所不同的是,两位创始人Haavard Nord和Eirik Chambe-Eng从一开始就选择了开源Linux。在上个世纪Linux刚刚萌芽之初,他们快速研发出自己的核心产品Qt和Qtopia二者都是开发Linux手机和其他设备应用的可定制的开发环境和用户界面。从本质上说,Qtopia之于Linux犹如UIQ和Series 60之于Symbian。“1994年,开源的影响很小,但那个时候有很多独立的黑客和开发者,他们对开源的追崇和狂热,使规模不大的开源社区异常活跃。这种活跃决定了奇趣的选择和以后要走的路。” David说。

  截止到今年8月份,奇趣科技服务的客户数已经达到了5000家,“对一家全球仅232名员工的企业来说,能够服务于5000名用户,不能不说是一个奇迹。” 奇趣科技(北京)有限公司副总经理兼奇趣科技专业服务部门亚洲主管Markus Mediger对此很是自豪。现在,奇趣科技核心的Qt和Qtopia已经被应用于数百万部已上市的Linux手持设备中。

  寻求空白地带

  2005年,奇趣科技在中国成立了中国办事处,试图攻入中国移动通信这块巨大的市场。

  众所周知,在中国的移动设备通信领域,厮杀已相当激烈。奇趣科技选择了为移动通信运营商们提供自己的核心平台,而不是直接面对终端用户,而运营商们在奇趣科技提供的Qt或者Qtopia上也能够更容易的开发自己的产品设备。

  KDAB是来自瑞典的一家公司,“他们希望能够成为奇趣的合作伙伴,他们认为Qt不仅能够为他们提供技术能力,还可以帮助他们开发产品。” David告诉《互联网周刊》,“同时,这些客户也在无形中帮助奇趣提高了其平台的价值,合作伙伴越多,奇趣作为平台公司的实力就越强,我们所给予的市场价值也就越大。”

  为了与生态链各个环节的厂商寻求合作,奇趣最近还在美国设立了一个生态系统部门。“实际上我们并不对上下游的合作伙伴进行区分,奇趣会时刻关注这一生态链中,哪些公司是需要奇趣主动去合作的,这对奇趣的成功至关重要,所以只有一个奇趣合作伙伴的管理部门是不够的。同时,我们也通过给客户提供方案的方式进行合作,比如在一个会展中一起展示合作的产品,前不久在北京举办的2007 Linux移动通信展就可以看到奇趣芯片组的合作伙伴,以及Linux嵌入式的合作伙伴等。” 从2006年底开始,奇趣已经可以为合作伙伴提供在线支持。

  2006年8月,奇趣科技推出了一部消费者可编程的手机。浅墨绿色外壳,简约平板设计,这款手机推出后在一家手机水货网站亮相时,已经有不少的手机迷为它清新的外形所吸引。奇趣科技确实成功的另辟了蹊径,这款标价600美元左右的手机不针对终端用户,也就是说在一般手机营业厅柜台看不到它的身影,它只为开发商和移动电话运营商提供一个可测试和改进新型移动电话服务的平台。而且前不久得到的奇趣科技的官方消息,发售一年有余,其库存的Greenphone电话已全部售完。“Greenphone的成功,部分得益于它填补了市场的空白。它提供了一个开放电话平台,既可用于试验,也可用于创建新型的应用软件。这在很大程度上吸引了开发者的参与。” 奇趣科技首席技术官Benoit Schillings说。

  灵巧精灵

  奇趣科技的英文名字—Trolltech,来自一个典故。Troll是挪威森林里的一种小精灵,尽管表情有些诡异和狰狞,但却是象征独立和个性化的化身,很贴近奇趣公司的核心理念。

  从性情上看,David似乎很符合作为奇趣的一份子,他有着Troll所宣扬的个性,比如因为他喜欢中国古典家装风格,奇趣位于丰联广场21层的整个办公区都挂满了从潘家园淘来的老北京黑白照片。在这位在中国有着10年工作、生活经验老外的博客首页,你能看到两位瑞典小姑娘身穿中国旗袍的欧版风范,“那是我的两个女儿,她们都比我更了解中国。” David 不久前和女儿一起去中国剧院看瑞典儿童剧,坐在身旁的小姑娘已经可以滔滔不绝给他翻译舞台上的小剧情。“其实,我们在北京的外国同事都习惯在本地社区生活。”所以奇趣科技办事处的外国员工多少都可以用普通话交流,包括David。而问及是不是已经很了解在中国做生意时,David肯定的说,“2003年,我在中国有了自己第一笔生意的时候,当时觉得中国的客户比较天真,他们觉得做一个Linux手机是很容易的,不知道低成本、多功能的手机比生产一部电视机还复杂。现在情况有了变化,中国用户有了自己好的工程师,深知未来的挑战,同时也抱有更加美好的愿景。”

  同微软、IBM这样的巨头们相比,全球仅232人的奇趣肯定只能是一家小公司,“但在开源圈子里,作为第一拨涉入开源的企业之一,奇趣就可以称得上是一家有规模的公司,因为完全基于Linux真正成长起来的公司仍然寥寥无几。”

  前不久,那个头戴尖尖精灵帽、右手叼着一条小海鱼的Troll,从总部快递到了奇趣各个办事处,以后它会陪伴在奇趣全球每个办事处的前台小姐身旁,没有挪威海盗的勇猛,倒多了一份北欧精灵的奇思妙想


  说到Qt,不能不说到C++,这门伟大的语言。因为其面向对象的编程思想陡峭的学习曲线,一开始学习起来很是吃力。Qt从QT4开始基本封装了很多C++的工具库和界面库,而且支持跨平台,这是它最大的优势。相比于古老的MFC和使用C#的WPF来说,我更喜欢Qt来进行C++的界面设计,这也是我从新开始拾起Qt学习之路的原因。

  说完了感受和学习的原因,就开始介绍Qt5了。我这里只做简单的介绍,重要的还是在学习过程中体会Qt的编程逻辑设计思想

  Qt,坦白来说,并不只是一个界面库,他是C++编程思想的集大成者。它是得到完善的C++应用程序框架。使用Qt,在一定程度上你获得的是一个“一站式”、“全方位”的解决方案,STL、string、XML、数据库、网络这些零散的功能都包含在Qt中,并且得到了封装,一并开发者使用。

  跨平台GUI通常有三种实现策略,分别是:

  1. API 映射:API 映射是说,界面库使用同一套 API,将其映射到不同的底层平台上面。大体相当于将不同平台的 API 提取公共部分。比如说,将 Windows 平台上的按钮控件Mac OS 上的按钮组件都取名为 Button。当你使用 Button 时,如果在 Windows 平台上,则编译成按钮控件;如果在 Mac OS 上,则编译成按钮组件。这么做的好处是,所有组件都是原始平台自有的,外观和原生平台一致;缺点是,编写库代码的时候需要大量工作用于适配不同平台,并且,只能提取相同部分的 API。比如 Mac OS 的文本框自带拼写检测,但是 Windows 上面没有,则不能提供该功能。这种策略的典型代表是 wxWidgets。这也是一个标准的 C++ 库,和 Qt 一样庞大。它的语法看上去和 MFC 类似,有大量的宏。据说,一个 MFC 程序员可以很容易的转换到 wxWidgets 上面来。
  2. API 模拟:前面提到,API 映射会“缺失”不同平台的特定功能,而 API 模拟则是解决这一问题。不同平台的有差异 API,将使用工具库自己的代码用于模拟出来。按照前面的例子,Mac OS 上的文本框有拼写检测,但是 Windows 的没有。那么,工具库自己提供一个拼写检测算法,让 Windows 的文本框也有相同的功能。API 模拟的典型代表是 wine ——一个 Linux 上面的 Windows 模拟器。它将大部分 Win32 API 在 Linux 上面模拟了出来,让 Linux 可以通过 wine 运行 Windows 程序。由此可以看出,API 模拟最大优点是,应用程序无需重新编译,即可运行到特定平台上。另外一个例子是微软提供的 DirectX,这个开发库将屏蔽掉不同显卡硬件所提供的具体功能。使用这个库,你无需担心硬件之间的差异,如果有的显卡没有提供该种功能,SDK 会使用软件的方式加以实现。
  3. GUI 模拟:任何平台都提供了图形绘制函数,例如画点、画线、画面等。有些工具库利用这些基本函数,再不同绘制出自己的组件,这就是 GUI 模拟。GUI 模拟的工作量无疑是很大的,因为需要使用最基本的绘图函数将所有组件画出来;并且这种绘制很难保证和原生组件一模一样。但是,这一代价带来的优势是,可以很方便的修改组件的外观——只要修改组件绘制函数即可。很多跨平台的 GUI 库都是使用的这种策略,例如 gtk+(这是一个 C 语言的图形界面库。使用 C 语言很优雅地实现了面向对象程序设计。不过,这也同样带来了一个问题——使用大量的类型转换的宏来模拟多态,并且它的函数名一般都比较长,使用下划线分割单词,看上去和 Linux 如出一辙。gtk+ 并不是模拟的原生界面,而有它自己的风格,所以有时候就会和操作系统的界面格格不入。)Swing 以及我们的 Qt。

  Qt 和 wxWidgets 一样,也是一个标准的 C++ 库。但是它的语法类似于 Java 的 Swing,十分清晰,而且使用信号槽(signal/slot)机制,让程序看起来很明白——这也是很多人优先选择 Qt 的一个很重要的原因。不过,所谓“成也萧何,败也萧何”。这种机制虽然很清楚,但是它所带来的后果是你需要使用 Qt 的 moc 对程序进行预处理,才能够再使用标准的 make 或者 nmake 进行正常的编译,并且信号槽的调用要比普通的函数调用慢大约一个数量级(Qt 4 文档中说明该数据,但 Qt 5 尚未有官方说明)。Qt 的界面也不是原生风格的,尽管 Qt 使用 style 机制十分巧妙地模拟了原生界面。另外值得一提的是,Qt 不仅仅能够运行在桌面环境中,还可以运行在嵌入式平台以及手机平台。

  Qt 第一版于 1991 年由 Trolltech (奇趣科技)发布。后来在 2008 年,Nokia 斥资 1.5 亿美元收购 TrollTech,将 Qt 应用于 Symbian(塞班) 程序开发。2012 年 8 月 9 日,Nokia 将 Qt 以 400 万欧元的价格出售给 Digia。

  伴随着 Qt,一直有两种授权协议:商业授权以及开源授权。在 Qt 的早期版本,商业授权包含一些开源授权不提供的组件,但是在近期版本则不存在这个问题。以往人们对 Qt 的开源授权多有诟病。早期版本的 Qt 使用与 GPL 不兼容的协议授权,这直接导致了 KDE 与 GNOME 的战争(由于 Linux 使用 GPL 协议发布,GPL 协议具有传染性,作为 Linux 桌面环境的 KDE 却是基于与 GPL 不兼容的 Qt 开发,这就不遵守 GPL 协议)。不过,现在 Qt 的开源版本使用的是 GPLv3 以及 LGPL 协议。这意味着,你可以将 Qt 作为一个库连接到一个闭源软件里面。可以说,Qt 协议的争议已经不存在了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!