Qt简介

Qt 作为一套跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。API丰富、IDE易用、跨平台、优异的图形视图框架、文档齐全等均是其特点。详细的 Qt 介绍可以点击跳转查看。
Qt Creator作为一个上手非常容易的IDE,也同样值得称道,当年VS 2017发布时号称宇宙第一IDE,我们戏称Qt Creator为宇宙第二,我们用惯Qt Creator后基本抛弃了VS。Qt Creator包括项目生成向导、高级的 C++ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等。

Qt的对手们

较为常见的Windows UI框架

  • MFC:微软发布的C++ Windows 框架,主要是对Win API进行了封装。
  • Winform / WPF:微软发布的UI框架,.NET。WPF为取代Winform的产品。

常见的跨平台应用程序框架

  • Electron / NW.js :NodeJS相关,使用Web技术(HTML、CSS、JS)开发桌面应用,极大的方便了前端人员的工作。
  • CEF:基于Google Chromium项目的开源Web browser控件,支持Win、Mac、Linux,完善H5 Web开发,可集成C++。一般使用Web技术开发UI,C++做底层,可通过修改编译选项和源代码后编译的方式定制自己的窗口。
  • Flutter:基于Dart语言的UI框架,目前主要用于移动端开发,跨全平台只是时间问题。一套代码即完美适用桌面端、移动端还是比较吸引人的。关于Flutter未来的表现,可以前往查看此文。
  • wxWidgets:开源跨平台C++框架,使用比较广泛,与Qt类似。完全使用LGPL协议具备一定的优势。
  • GTK+:开源GUI工具包,但以C实现面向对象存在一定的劣势。

本文仅对与Qt功能类似的框架做了罗列,并不会在此进行对比和讨论,且该系列文章只是将以往的经验与心得写出,给后来学习Qt的人做个参考。如若您对各种框架有兴趣了解更详细的内容,可自行搜索。若希望进行探讨,可留言。

Qt的优缺点

Qt优缺点都会比较有代表性,下面进行罗列。
一般的优点:丰富的API、最为面向对象、支持2D/3D图形渲染、支持OpenGL、开发文档量大且齐全、支持XML、架构健壮且性能不错、支持平台更多等特点;
一般的缺点:使用非标准C++、庞大且臃肿、性能表现不是特别优秀等。
以上罗列的是一些抽象的且普遍被人提及的一些优缺点,但涉及一些具体的特点或者不为人知的、需要实践得来的点一般都不会在百科类型文章中提及,你可以在下面小编总结的文字中咀嚼一二,如有不当之处欢迎留言指导与讨论。

Qt优势之处

  • 优良的跨平台特性:只要不涉及系统级别的功能实现,一般情况下Qt的跨平台表现良好,修改率很低。小编工作中经常需要操作Windows底层功能,导致产品一直未能做到跨平台。
  • 开发效率高:此开发效率是相对总体而言,在C++类型的框架中,Qt的应用程序开发效率绝对算高的,当然与Web开发方式相比还是有些劣势。基础UI开发部分有QWidget方式、布局管理与qss效果实现,快速UI开发如Quick与QML,特别之处如信号槽的机制,同时配合Qt Creator这个合适的IDE,这些都对开发效率有明显提升。如若在嵌入式平台,采用Qt开发绝对可以是首选。
  • 强大的图形视图框架:此处不是指Qt widgets的内容,是Graphics View Framework。一般的UI开发性能差异不明显,当有成千上万个Item以及涉及超大场景的功能设计时,图形视图框架仍然可以应对自如。文档说可以包含数百万个Item,曾经做过测试,确实所言非虚。

Qt劣势之处

  • 信号槽的效率问题:信号槽的性能问题一般情况下较难感知,但在延时敏感的功能中,如需要计算时间戳、或涉及听觉视觉的功能,过多的信号槽可以带来明显的延时,此种情况中,采用回调方式更可取。
    效率的问题主要是Qt信号槽机制涉及函数查找及参数传递,其中包含了链表操作、事件处理以及线程中锁部分的处理。一般情况下,信号槽与回调的效率有10倍之差,情况复杂时即远不止10倍。
    Qt的UI绘制、事件传递、网络模块等功能,都非常依赖信号槽机制,这也同时意味着Qt的运行效率如果深究起来,可能算不得优异。但由于是C++框架,性能终归不属于太差。
  • 网络模块的性能问题:Qt network模块性能差强人意,前文提到了信号槽机制的影响,此外并发和数据传输性能均较低,这与Qt底层机制与架构有关。使用Qt网络模块开发小型功能没问题,大型系统可选用其他库,毕竟C++相关的网络库非常多。
  • Qt Widgets 性能问题:前文提到了信号槽的问题,由于Qt widgets中涉及大量的绘图、事件等的信号传递,这是对效率的一大影响;此外Qt widgets图像渲染都是自绘,不存在硬件加速,如若场景变的复杂,性能会有明显的影响。
    虽然Quick与QML可以支持硬件加速,支持OpenGL,图形渲染性能也非常强悍,但Quick和QML存在硬件兼容的问题。我们开发产品过程中,曾经做了Qt4迁移到Qt5的尝试,希望能更多的利用Quick2的强大特性与功能,没曾想Quick2在HD Graphics3000显卡或低级别显卡中不能运行,程序打开即崩溃或白屏,也尝试过自行编译Qt源码使用不同的选项参数,但未能解决此问题,至此产品再没有使用过Quick2的功能。

哪些APP用了Qt?

由于本人未接触过很多用了Qt的APP,下面仅将小编接触过的进行罗列,以供初学者能初步了解Qt的应用有哪些,说不定有感于应用之广泛能更加坚定学习的决心,同时对于了解Qt的人来说也可以随意看看。若想了解详细的清单,可自行查看Qt项目清单 、Github中的Qt项目。

著名的

  • 剑网3
  • Opera
  • YY
  • WPS
  • Maya:专业3D相关软件
  • Google Earth
  • Skype

小众的

  • LMMS:开源音频工作站
  • MuseScore:开源打谱软件
  • FreeCAD

Qt 适合做哪些事?

理论上来说,Qt可以做能想到的任意APP,因为Qt大且全。但做产品需要考虑开发难度、使用性能、运行效率等问题,这样Qt就会排除调很多开发方向。

  1. 嵌入式APP:这个方向当仁不让
  2. 桌面客户端:如果开发一般客户端,Qt没问题。但涉及到系统级别的功能,如触屏、系统事件处理等,最好的方式还是采用原生API或其他框架结合开发。图形动画方面,Qt property animation和QML animation相结合,可以做出非常多好看的动画。
  3. 网络应用:小型C/S网络系统的开发,完全采用Qt模块没问题。若需要开发较大型的网络应用,最好是使用Qt与其他库或框架相结合的方式。
  4. 多媒体系统:Qt多媒体模块比较依赖系统库,如音视频解码就依赖系统解码库。但对于开发一般的多媒体系统,Qt还是可以从容应对,Audio Multimedia模块的功能还比较完善。但对于开发高级多媒体功能,还是需要借助其他库或框架,比如常见的FFmpeg、PA、ASIO等。

为什么还要用Qt/C++?

前段时间接触了NodeJS/electron和Python开发桌面应用,甚至包括跨平台大热的Flutter,对于各个框架、语言间的区别稍有所体会,每个社区和论坛中对于语言框架对比优劣经常是吵的翻天覆地,在此并不想鼓吹孰优孰劣,仅仅是想为有志学习Qt的同志们或Qt的普及提供多一些的素材和经验之谈。
依稀记得在某篇文章中,作者比较偏向Electron类型的跨平台解决方案,更希望能只通过前端技术走天下。诚然现今NodeJS大火,以及Web技术中轮子的丰富性无可比拟,通过Web技术进行开发,效率甩其他开发方式老远,技术丰富性迭代更新更加快速,社区和解决方案也非常完善。那Qt/C++存在的意义又是什么呢?
首先我们需要明白一点,技术选型是一种权衡,并不是只有唯一解,不能一概而论说哪个更好!作为软件技术人员,现在很少有一种技术走到黑的人,我们终究要在不断学习新技术以及尝试新方法的道路上一直走下去的。

嵌入式应用

  • 开发嵌入式类型应用时,Qt作为首选项无可替代,此种情况也不需要做讨论。

桌面应用

  • 业务流程类型的应用,其实使用何种语言、框架并无差别,这种产品的开发讲究快和稳。Qt在这里可以用,但并不具备优势。
  • 性能要求较高的应用,Qt/C++作为偏向native的技术类型,自然是更具备性能的优势的。其他框架如Electron之类的框架,是没办法满足这些条件。
  • 功能复杂的专业应用,使用native类型开发,应用体验会更好。明显的例子比如微信客户端和网页版。
    相对来说,Qt在跨平台桌面应用开发上是一个为数不多的好选择,相比较wxWidgets之类的方案,Qt更加成熟且易用,同时也具备相当多的优点和缺点。Electron之类的方案属于是前端的延伸,由于前端的天生优点,导致开发效率和轮子都比较有优势,但开发桌面应用同样具备较大的劣势。综合来说,由于C++性能较好的特性,且Qt可以与其他C++库或框架结合开发,使用Qt/C++来开发桌面应用是一个相对合适的选择。

移动端

Qt开发移动端其实是有问题的,曾经想将产品直接迁移至安卓版,过程中坑太多。但是如果移动端的功能简单,是可以尝试使用Qt的。

Demo开发

在学习开发的过程中,时常需要开发各种Demo来验证学习成果。其实Qt作为一款入门较为容易且学习曲线不太复杂的框架,是可以作为新手的入门技术的。

以上即本篇的全部内容,欢迎大家指正问题,提出批评和建议!

第一篇 Qt能做什么?相关推荐

  1. 第一篇:坚持做难而正确的事情

    一直想写点和工作相关的文章,却下不去决心.一是笔者文采实在是不怎么样:二是工作比较忙(大部分人看来这都是借口),平时上班回家挺晚,周末又想休息,于是久而久之就习惯不想动了. 这是笔者开篇,想了下就给了 ...

  2. 第一篇随笔, 正在做 ESP32 , STM32 , 树莓派 RaspberryPi 的创客工具

    先随便写写一些思路, 以后再整理. 这段时间笔者做了一些硬件开发, 领悟了一些事情. 1 - 在常规创客的角度上, 硬件开发所需的知识面比较广, 非常广, 但不算太深. 2 - 发现硬件开发由于其特殊 ...

  3. Agv、Rgv 车辆控制调度系统开发第一篇

    Agv.Rgv 车辆控制调度系统第一篇 为什么要做这个系统 先看作品 从头讲起 算法讲解 编程语言 从哪里开始 继续深入 预告 链接 问题解答 为什么要做这个系统 说白了是为了赚钱,在一个项目中发现公 ...

  4. 第二篇:Haploview做单倍型教程2--分析教程

    大家好,我是邓飞,这里介绍一下如何使用Haploview进行单倍型的分析. 计划分为三篇文章: 第一篇:Haploview做单倍型教程1–软件安装 第二篇:Haploview做单倍型教程2–分析教程 ...

  5. 第一篇博客____望好风长吟

    看了几年别人的博客,如今终于下定决心自己也开一个,作为我第一个博客的第一篇日志,做个小小纪念.虽然早已过了博客在大陆大红大紫的年代,虽然不是大V振聋发聩的思想不是大牛技术高深的分析,虽然我只是中国万千 ...

  6. 第一篇文章,做个纪念

    第一篇文章,做个纪念,这个blog好吗?拭目以待! 转载于:https://blog.51cto.com/197536/88241

  7. Python 用pygame 做一个游戏的开始界面(小白第一篇博客)

    Python 用pygame 做一个游戏的开始界面(小白第一篇博客) 主要功能实现 本篇文章主要是实现了一个游戏开始界面的两个功能: 1,将鼠标放到"开始游戏"或"结束游 ...

  8. 第一篇SCI之前要做的事儿

    动手之前先规划,规划之前先参考前人的经验. 1.参考前人的什么经验呢?需要能提出精准的问题.例如,"如何写第一篇SCI论文?" ,"写SCI论文需要注意什么?" ...

  9. 【QT开发笔记-基础篇】| 第一章 QT入门 | 1.1 为什么要学习Qt

    本节对应的视频讲解:B_站_链_接 https://www.bilibili.com/video/BV1334y1776z Qt 是一个跨平台的 C++ 图形用户界面应用程序框架 Qt 为应用程序开发 ...

  10. 第51篇 Qt 5.5全新的开始

    导语 时间转眼而逝,看一下上次发的教程,已经是一年前的事情了.这一年发生了很多事情,包括自己也包括Qt.当然,自己很忙或者说为了编写<Qt 5编程入门>这些理由,并不能为一年的搁置进行开脱 ...

最新文章

  1. 《LeetCode力扣练习》第2题 C语言版 (做出来就行,别问我效率。。。。)
  2. Java类加载机制:双亲委托模型
  3. 通过PowerShell查询本机IP地址
  4. CSS知识点整理(2):框模型,定位
  5. 【APUE】孤儿进程与僵死进程
  6. hive 如何将数组转成字符串_教你如何将Power Logic的原理图转成Orcad的原理图
  7. iOS学习笔记3 - 命名空间
  8. 第一章:初识python
  9. python并发编程 协程_Python并发编程协程之Gevent
  10. php 直播源,【Bilibili直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)...
  11. 清除xcode缓存文件以及清楚mac 微信缓存
  12. 什么是GreenSock动画平台?
  13. 电脑散热风扇轴承分类
  14. 数据结构——查找与排序
  15. Halo博客 -- ③ 本地运行
  16. 12.11晚自习习题
  17. 二年级期末计算机基础试题答案,小学二年级语文期末考试卷
  18. 正确将图片保存到相册的方法
  19. 易基因 | 宏基因组测序带给了我们什么?
  20. Android Ping IP地址

热门文章

  1. 项目管理知识体系指南 (五)
  2. 分享一个在线Word编辑的jQuery插件
  3. MT7620A的DTS
  4. 燕山大学软件测试,工程技术研究期刊版面费_软件测试期刊_燕山大学学报版面费...
  5. es中filtered和filter的区别
  6. xp系统怎么添加wifi连接服务器,XP系统怎么连接无线路由器
  7. [SinGuLaRiTy] 动态规划题目复习
  8. 怎么申请企业邮箱?手机怎么申请免费邮箱?
  9. 广度优先搜索生成树怎么画_无向图的深度优先生成树和广度优先生成树
  10. 微信小程序中map地图中取消地点图标文字(干净地图)