一、前言
为什么说QT越来越成为界面编程的第一选择,这要从当初为什么从MFC转到QT开始说。若想把MFC开发界面想做得好看一些是十分困难的一件事,引用第三方基于MFC的界面库代码也比较混2 ` } [ + x D $乱,而当时看到qt有qsc ~ e 4 g [s样式设计这么个功能,就决? T } !定试下。然而当项目成功移植到到QT后,真心觉得MFC可以抛弃了R O D Y t ] d,MFC相较于QT缺点实在太多了。并且MFC还有一个致命的缺陷,那就是没法跨平台。
至于为什么不直接使. ) 用C# WPF来做E N 2 J c e r 1界面,如果项目和工具是C#做的,使用C++确实可以和C#互相调用,并且也能断点调试。但是在性能上还是有不少的损失。这对于我们做音视频和三维仿真项目是有影响的,所以只能在一些对性能没有极致要R S Z # 0求的1 C X % i ^项目中使用C#。
二、QT历史
简单来y I U q介绍一下QT历史,知道历史的目的是要借此判断使用此d 8 l 1 R D s库是否会有风险,是否会突然停止更新,很多开源库就是没有做好商业化而最终都是停掉了。
-
Qf % v G # i 8 l vT由奇趣科技公司开发
-
2008 诺基亚从奇趣科技公司收^ a )购Qt, 并增加LGPL的授权模式
-
2011 芬兰的Digia从Nokia收购了Qt的商业版权,从此Nokia负责Qt on Mobile, Qt Commercial由Digia负责
QT的高峰期是在诺基亚智能手机如日中天的时候,那时候诺基亚塞班系统的手机应用大量都是基于QT研发的,但是随着苹果和安卓的流行a [ _ y 6 B ,塞班无奈退出历史舞台。而QT的手机C * , P a k ^ X端开发需求也7 @ Z ^基本被替代。但是QT在嵌入式、电力系统、军工系统中的应用一直没有被替代。
三、QT现在使用情况
QT如今被广泛( . R P M _ h D的应用于u O . G 4 p y 3 D嵌入式、电力系统、军工} V i = ! ) c系统等要与硬件交互的界面系统中,并且大量专业的跨平台应用软件也是使用QT开发的。
digia接手QT后开发出了安卓和IOS版本的QT,实现了跨平台的开发。但目前仍不建议使用QT开发安U ~ { | @卓和IOS的应用,两个平台坑还是比较多的,但相信会越来越完善。
四、QT提供的工具
QT不仅给2 % )我们提供了功能丰富的SDK开发包,而且提供了强大的工具,这也是我们选择他的原因4 } G Q u J V b (之一。
1. 基于VS插件qt-vs-addin
2. Qt助手(手册)
qt的开发手册还是比较完备的,而且包含了很多示例的源码分析。
3. 基于a # $ UXML的界面设计器Qt Designer
一; V 0 e v款. w a t G ( h便捷E # 8 R A的解码设计,可以说是C++领域使用最方便的界面设计器。
4. 跨平台的开发工具 QtCreator
支持跨平台的C++开发工具,而却能够说是在linux上使用最方便的C++开发调试工具,就算是不用QT库,也能用它来开发跨平台的c+q A C 5 k T +项目。
QT框架优势
1. 工具丰富
QT提供了大量功能齐全的工具。
2. 功能B P - 8 ,丰富
除了界面库的使用之外,QT还提供了3d库,音频库,WebEngine,数据库SDK,网络库等,使我们做应用变得更简便。
3. 开源并跨平台
除了可以通过QT源码进行移植之外,QT官方已经提供了关于wr 3 `indows,Android,ios,linux中运行的SDK。
4. 架构的优势
这部分优势很多,首先界面源码与用户源码的隔离操作,QT的策略是哪怕没有界面都会生成一个对应的源码文件,每一个界面设计文件xps.ui都会解析其中的xml生成一个对应的ui_xps.h 文件,这个文件你完全不需要修改,如果要调用界面中的控件直接通过 UA Q #i::XPSClass ui;这个对象定义也是q = S E D ) ] = 3写在ui_xps.$ t *h中。也就是说你的业务逻辑就和界面控件对象的创建和设置直接做了隔离。
其次关于事件处理的J V * t便捷(灵活的信号槽机制),QT给用户提供了信号槽机制,以至于可以很好的降低耦合,从而提升代码的复用性。
5. 及其便捷的样式设计(像开发web程序一样设计界面)
使用QT可以很容易的做一个圆角边框,并且C J # ! I 5 i # q有渐变效果,鼠标移上去还发生变化,可以参考下面的样式表,qss基本和css类似,包括支持css的选择器,可以通过类名,对象名,和父类名称来设置。
QPushB- U 8 7 $ 7 { mutton:!hx l Pover
{
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(120, 120, 120, 255), stop:0.495 rgba(39, 39, 39, 255), stop:0.505 rgba(39,39, 39, 255), stop:1 rgba(120, 120,120, 255));
border-radius:5px;
}
QPushButton:hover /* hover 鼠标悬停*/
{
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:. 7 X f1, stop:0 rgba(39, 39, 39, 255), stop:0.495 rgba(120, 120, 120, 255), stop:0.505 rgba(120,2 G J N @ K = #120, 120, 255), stop:1 rgba(39R A % $ , 39,39, 255));
border-radius:5px; /*圆角边框*/
}