文章目录
- 现在2022年,Qt发展如何?是就业的好选择吗?
- 如何学习Qt,c++到什么程度可以去学qt?
- 现在 Qt 好找工作吗?
- 为什么工业软件开发一般用的都是QT?
- 初学QT怎么学?
- 请问目前做windows桌面应用程序,MFC、QT、C#哪个更好?
- 如何才能学到Qt的精髓?
- 如何才能学到Qt的精髓?
现在2022年,Qt发展如何?是就业的好选择吗?
什么叫好选择。
现状是,大部分做客户端的程序员面临这些类似的问题,
一、是市面上做客户端的薪资普遍不高,具体到用Qt的公司大部分是第二产业,军工、医疗、机械、公共事业,这些企业一般也不会给客户端开较高工资。
二、只会Qt其实是劣势,因为用Qt写代码和常规的C++ 有很大不同,很多C++的坑你都不会遇到,Qt用多了都不敢说自己熟悉C++了,其次,你多做几年就会发现单纯的用Qt写客户端其实并不是一个复杂的工作,对自己的提升有限,在客户端的路径上你必须学习如音视频、OpenGL之类的知识才能突破自己的薪资限制
如何学习Qt,c++到什么程度可以去学qt?
c++基本语法学完就能去学Qt了,变量,类型,循环,判断,指针,引用,模板之类的。
我是先学C++后来才学的Qt,主要就是把类这个概念学会,了解,掌握。
其中的知识点大概就是类的构造,继承,多态,操作符重载(刚开始不怎么用)这些概念。当你会了这些就可以开始学习Qt了。
还有一点,你最好对“事件循环”这个概念有一定了解,这样上手会快很多。
Qt上手还是非常的容易,自带的帮助文档中的内容非常详细,还有示例代码,如果想着重学习UI的话,给你说一个算是小技巧吧。
Qt Designer能让你通过以拖动控件放置的方式,可视化的设计UI界面,当你设计好界面编译完成后,在构建目录中会找到文件名形如“ui_XXXX.h”的头文件,这是Qt根据你的UI,自动帮你生成的C++代码,内容就是UI的C++实现方式,你可以跟着它自动生成的这段代码学来学习UI是怎么实现的,这个比自己看文档要来的直观很多。由于手写代码实现UI有时要考虑的东西太多,哪一步该做什么如果步骤不对可能就不会显示,所以这种方法还是很方便的。
好好学习,加油!
2022/03/07更新-------------
看知乎发现很多初学者会纠结于该学习哪个框架,也会有些“大牛”抨击这个框架不行,那个技术辣鸡的言论,我觉得拘泥于这些毫无意义。对于软件开发者来说,使用什么框架从来都不是我们学习的最终目的,我们应该将注意力放在如何分析问题,解决问题上。如果你认为学了Qt或者其他框架,只要调接口就算会了的话,是不太可能对你技术的提升有所帮助的。我们在学习一个框架的时候,除了要学他的接口怎么用,最重要的是学习他的接口是怎样实现的,他的框架是怎样设计的,将来你遇到类似的情况,在脱离了框架的时候,是不是也能用他们的方法来解决问题?这对你来说才是真正有用的东西。
如果你将自己局限于调接口就行,那你一辈子都注定是个底层码农。
现在 Qt 好找工作吗?
毕业工作以来在电力,军工,教育三个行业做开发工作,基本是在哪个行业开发就会涉及到一些新的技术,但是都是以qt为主来做的开发。比如从事电力做仿真,做socket通信,组态建模开发,跨平台linux下开发,qnx系统下移植,界面图表用到qwt,chartdirecter,脚本用了js,数据库用sqlite,DM;做军工工作,做了gis下仿真,军标标会,二三维仿真推演,qt集成osg,开发基于C++的仿真引擎,使用zeromq通信,数据库用sqlserver,开发分布式系统应用;做教育行业,做了嵌入式开发,技术涉及了指纹识别,人脸识别,图像识别,语音识别,用到opencv库,商业库,学了做Python脚本语言,通信用过redis消息队列,activemq,rabbitmq,数据库用到MySQL;基本上都是以qt做界面为主,需要用到别的技术再学习拿来用,但是都是熟悉能使用的程度,没有深入研究,电力和军工都是做项目,教育是产品,相比较做项目比较累,经常性的加班,但是工作一直饱满上班比较充实,一直可以写写代码研究问题,产品开发新产品还好,老产品就是做维护工作,工作量较小。
为什么工业软件开发一般用的都是QT?
说说个人的理解:
Qt不依赖图形系统。低端工控机的硬件配置可能是连一个图形系统都跑不起来的,而Qt可以直接写屏实现图形界面。
其它不依赖图形系统的开发框架都比Qt弱。比Qt强的开发框架基本都依赖图形系统。
所以Qt就成为当下有现成解决方案中最强的开发框架了。
至于虚拟机,浏览器这些东西。。。你们觉得一个连图形系统都配置不起的嵌入式工控机会搭载浏览器跟虚拟机吗?java,python,html5等方案直接淘汰。
所以简单说:Qt对硬件配置要求极低。而C++性能又相对其他语言高,所以成为低配设备的首选。
补充一些内容吧:
就我司的情况而言,能跑安卓的机子基本都会考虑编个安卓上去。只有硬件配置低,跑不起来安卓的目标机才会用Qt开发。而能选型用Qt的目标机,基本上属于用Qt就是极限,根本不可能跑得动任何更大软件框架。
至于跑安卓有多简单,可能很多人没概念,大概就是绝大多数你选型的产商都可以给你提供立等可用的安卓选项,不用自己做的那种。
反倒是用Qt,对系统组的技术要求要高。毕竟系统组还要给你制作一套交叉编译的工具链,而安卓的工具链就是产商提供的现成的。对于有能力编译一整套工具链的系统组来说,质疑其技术能力是完全没有意义的,毕竟无论你是用啥编译器,人家连gcc,clang编译器本身都能重新编译出来,还能不懂你一个aot的编译?事实上,最终搭好环境后,搞虚拟机那些语言开发的程序员也不需要懂交叉编译,而搞Qt的开发就必须得懂交叉编译。
提升配置之后,java或者安卓逐渐会变为首选,但在有限配置下Qt依然为大,毕竟Qt强制了C++11的支持。这一点也有不少功劳。
初学QT怎么学?
话不多说,直接上干货
根据不同人的喜好,我将介绍三种学习qt的主流途径
我这里也说一下我个人比较喜欢的学习顺序
先看视频了解大概——>网页教程当作“字典”快速查找——>书作为辅助
视频:
对于初学者来说,我首先推荐看视频
直接说优点:
1、最重要的一点,你看视频时可以看到演示过程的,这比你看网页和书都要直观。
2、看视频是可以倍速观看的,我一般都1.5倍速和2倍速看,缩短时间提高效率效果真的棒棒哒,非常适合想我一样阅读比较慢,可以听很快语速的人
3、视频课一般开始都会介绍一下整体框架的,可以快速有个大概的了解,也可以先做到心中有数,一般的网页教程和书的开头也会有类似的框架介绍,不过大家从小就适应了这种老师带的教学模式,看视频学起来可能会轻松一点
不过这里也有一些坑需要注意
在选择视频的时候需要看那些知识点密度比较大的来看。现在的Qt教学视频很多都是机构的内部教学视频的现场录制版,杂音比较大,而且会有挺多废话的,看的时候会有点效率不高的感觉。所以你在选择的时候不要觉得视频教程的全部时间越长就越觉得它说的知识点比较多,这是一个非常大的误区
然后视频去哪找应该不用我多说了,毕竟众所周知,B站是一个学习的地方,你想要的样子,他(她)都有哈哈哈。
如果你也懒得去自己找,用我推荐的也可以,下面推荐的是我看过觉得比较好的
推荐:
2020千锋_物联网_QT开发编程全套教程(通俗易懂)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com/video/BV1RA411q7Um?p=52
这个教程是我看了B站上的qt视频之后觉得做的比较好的,时间也不是很长,视频质量也还不错,很适合快速入门
QT案例_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com/video/BV1xJ411M7E4?from=search&seid=6812846755768475295
这是一个纯qt案例,结合上面的视频一起食用效果更佳。
网页教程
网页教程现在也挺多的,用来快速查找非常方便,你看过视频之后,时间长了有些东西怎么用你可能忘了,你这些网页教程里看看比翻书可能要快点,而且即查即用,代码还可以直接复制,真的很方便,谁用谁知道
不多说,直接上链接
《Qt 学习之路 2》www.devbean.net/2012/08/qt-study-road-2-catelog/
Qt教程,Qt5编程入门教程(非常详细)c.biancheng.net/qt/
Qt 学习之路_w3cschoolwww.w3cschool.cn/learnroadqt/tufx1j3q.html
Qt 快速入门系列教程 · Qt 快速入门系列教程shouce.jb51.net/qt-beginning/
这里说一下,前三个链接主要侧重的是代码怎么写,后面一个链接侧重的是ui拖拽实现
书籍
推荐一本吧,名字叫:C++ GUI QT 编程
因为书不是我推荐的重点,上面推荐的视频和网页教程已经挺全面的了,书只是作为辅助,比如你网络不好,不方面带电脑的时候看看,不过这本书确实写得挺好的
书长这样
本来想给个PDF下载链接,不过想想,看PDF的还不如直接看网页的教程呢
请问目前做windows桌面应用程序,MFC、QT、C#哪个更好?
回答问题之前,先装个逼——没有主导过生命周期三年以上的桌面软件项目的,闭嘴。你连一个桌面软件项目的生命周期都没经历过,你凭什么做技术选型?凭信仰吗?
装逼结束,正文开始。
首先,非主流技术和过时技术先淘汰掉,包括但不限于:delphi、mfc、c++ builder、gtk+、java系、易语言……
最终入围的基本上就三种选择:Web、Qt、C#。
首先说Web,我们明确一点,当下的桌面软件项目,必须具备完整的Web能力(包括开发/部署/运行/测试等),直观的说就是你的软件中必须包含浏览器。尤其是企业软件,发展到后期,除了核心功能之外,必然附带大量的增删改查模块,这部分不用Web你会极其难受。有些人可能native用的挺熟练的,觉得不就是表格表单报表么?我用native一样堆出来——相信我,你在浪费生命。
Web必然入选,但是注意,Web入选不意味着electron入选。事实上如果不是互联网公司的项目,我不建议使用electron。一方面,传统公司不需要迭代那么快,他们前端力量也有限,出了问题解决不了;另一方面,哪怕是互联网项目,发展到后期,也不约而同地开始约束前端随意调用nodejs API的行为。
建议使用libcef提供Web能力,同时native封装有限的API供Web调用。这里我不推荐使用框架原生的webview,比如QtWebEngine,以及winform自带的WebBrowser组件,这些工具比较冷门,资料少,出了问题不好排查,而且浏览器内核版本也未必符合要求。
结论:libcef入选,electron淘汰,原生webview淘汰。
接下来考察C#和Qt,这两个技术各有支持者,不是非黑即白的关系。比如我看韦大的答案下面很多人在争论工控领域应该用Qt还是C#,其实国内工控领域的老大浙大中控,这两个技术都在使用。
我个人比较推荐Qt,极其强大,跨平台,可以用C++单一语言(调试成本低),还有一些很贴心的功能,比如基于qss的换肤。不要觉得换肤不重要,实际上做项目卖软件的公司经常遇到这样的需求,要么是甲方想用专有皮肤,要么是你接到的项目是OEM项目,中间商要求换肤。
但如果使用Qt,我不推荐使用Quick(Qml),太非主流,而且对比Web没什么优势。建议能用Web的模块就用Web,需要深度开发的模块使用QWidget配合OpenGL深度开发。
结论:Qt入选,但是Quick淘汰。
C#能有一席之地,主要是因为传统。有些领域长期以来就是使用C#开发,人才比较集中(C#人才确实比C++好招,而且便宜,也更不易跳槽),开发效率也确实高。如果没有跨平台诉求,也不是前瞻性很强的项目,可以考虑沿用C#(关于前瞻性,多说一句,新冷战都要来了,你确定你的项目不需要跨平台嘛)。
用了C#,还要选择是用winform还是用WPF,按理说这不该是个问题——无脑WPF就完事儿了,毕竟开发效率高,对于高分屏等新问题微软也会有相应的支持。但是什么问题只要涉及到“传统”,就说不清楚了,只能说如果是新产品,不考虑技术资产继承的话,建议WPF。
结论:WPF入选,winform你看着办。
综上,如果是我来作架构师,通常情况下我会选择Qt+libcef。兼顾强大功能与开发效率,同时Qt和Web前端都是前景光明的主流技术,社区力量强大,技术风险小。如果考虑到特定行业的技术积累(不光是你自己的积累,还有供应商等等)和人才招聘,可以考虑WPF+libcef。
如何才能学到Qt的精髓?
被邀请了很久了,一直在思考,今天终于下决心开始写回答。
这个问题的确是够大的,Qt的代码规模在整个开源世界里也是名列前茅的,这么大的项目其中的精华是非常多的,很难说得全面,实际上我对Qt也不是完全了解,里面还有很多我不熟悉的东西。
首先,我想谈的是 signal/slot,Qt算是发明了signal/slot,这个思想也被其他一些框架语言借鉴了。
谈signal/slot之前先来谈谈C++的缺欠,这个问题也被讨论很多了,这里只谈一点,C++的设计目标是面向对象语言,它不仅提供了对象的定义和构建的方式,也定义了对象间的关系,比如 继承 派生 聚合,但是它没有提供对象间通信和共享数据的方式,这个缺点在一般程序的开发上不算个大问题,我们可以自己简单实现,但是对于GUI开发,这个缺点就被放大了很多倍。GUI上的对象实在太多,窗口是对象,布局是对象,定时器是对象,而且对象间有错综复杂的关系,通信和数据交换非常频繁,比如按钮按下要通知父窗口或容器对象,滚动条变化了要通知列表对象。这种数量庞大的对象以及复杂的通信关系,可不是自己搞个简单的实现就能解决的。
说到通信和共享,其实他们是一回事,共享很多时候就是为了通信,而C++里要通信就必然要共享。
比如,一个类实例拥有另一个的指针,就可以访问对方的数据,调用对方的方法了,这实际就是共享了一个指针,这个类指针也是另一个对象的this。访问数据和调用方法其实都是通信,把对方的数据拿过来,把自己的数据送过去,交换数据就是通信。
在C++里,由于没有GC,管理大量原生指针是极其危险的,对象的生命周期不可控,野指针的出现概率会很高,大型C++ 的GUI项目参与开发的人数众多,很难保证都不犯错。
那么用观察者模式呢?其实也一样,还是共享了IObserverXXX指针。
那么发消息行不行呢?比如 MFC那样,可以,但是本质上还是共享了窗口句柄,否则消息发给谁呢?而且还带来另外的问题,就是类型安全,消息的参数是无法类型安全的。
Qt作为大型GUI项目的Framework,它必须解决这个问题,否则这个程序是写不大的,写大了就会问题层出不穷。
来看一段代码,看看Qt 的解决方案:
Window::Window()
{
QPushButton *b = new QPushButton(this);
connect(b, SIGNAL(clicked()), SLOT(on_button_clicked()));
}
Window::on_button_clicked()
{
QPushButton *b = qobject_cast<QPushButton*>(sender());
b->setText("clicked!");
}
这段代码,通过Qt的signal slot机制,把QPushButton的点击事件连接到了Window的on_button_clicked响应函数上。
Window 和 QPushButton并没有互相保存对方指针,QPushButton的指针b 只是个局部变量,用过之后很快销毁,Window和QPushButton实现了通信,数据共享,事件响应,但是却没有共享指针,而且他们不受对方的生命周期影响,无论谁先销毁,这段代码都不会出错。
这种方式还是类型安全的,当signal和slot的类型不匹配的时候 connect是会报错的。
有人会说,我们用智能指针不就好了。好啊,智能指针你不会自己写吧,那么用boost?boost里能创建窗口吗?不能吧,还是要其他GUI库的,把两个异构的Framework撮合到一起也不是轻而易举的。再说了Qt出来的时候,别说Boost,STL都还没有呢。
signal/slot为对象间通信提供了非常灵活方便的实现,如果你只关心一个signal那就可以只connect一个,可以多个slot连接同一个signal,也可以一个slot连接到多个signal,Qt会负责管理连接关系和对象生命周期,对象销毁时会自动断开连接。
Qt为了实现signal/slot也是付出代价的,在无法改变C++语法的情况下,只能通过moc预编译器来扩展关键字。这大概是独一无二的实现方式了,后来的signal/slot实现要不用C++ template,或者发明种语言直接做到语法里,比如C# delegate。
最后总结下,Qt的signal/slot是为了解决对象间通信问题,同时避免共享指针造成的内存野指针和对象生命周期问题。
下一个议题,等我想好了再说。。。。
如何才能学到Qt的精髓?
需要一些计算机图形学知识,才能更深刻理解Qt。
首先是显示器。
最早的显示器是机械的尼普科夫盘。尼普科夫盘是显示器的雏形,知道其名即可。
然后就是大名顶顶的阴极射线管显示器,英文缩写为CRT。
当前最流行的是液晶显示器。
把显示器(从CRT开始)接到计算机上,就催生了计算机图形学。首先是矢量图。后来dram便宜了,出现了行扫描,帧缓冲区和各种图元(点线三角形)的扫描转换算法(光栅化)。
帧缓冲区通过显示控制器(Display Controller)连接显示器。
显示控制器分为CRTC、编码器(Encoder)、发射器(Transmitter)和连接器(Connector)。CRTC在帧缓冲区的整个范围取一个区域,相当于一个viewport,想象一下,帧缓冲区就是整个桌面,CRTC就是其中一个窗口。Encoder,对于VGA是DAC(数模转换器),对于HDMI和DisplayPort是serdes(串行编码)。发射器(Transmitter)是做信号和电平调整的。Connector就是具体的VGA接口或者HDMI及DisplayPort接口。
这是现代计算机图形学的基础。
后来,三角形成了最基本的图元,用于构建万事万物的模型。
两个同色三角形构成一个矩形。
有了点和描述字体点阵的字体文件,你就可以画文字。
有了矩型和文字,你就可以画label。
PS/2鼠标动作的时候会产生一个中断(你要有操作系统中处理中断的一般机制idt, int handler…),鼠标中断处理函数能从一个特定端口读出数据,这数据描动鼠标运动在x,y轴的±量和按键是按压还是弹开。配合内存中上一个鼠标的状态数据,就算出了当前鼠标xy轴坐标。
每产生一个鼠标中断,就按照一定的类定义,产生一个事件,并包装鼠标当前坐标、按键动作、状态为事件。
有了鼠标事件和label,你就可以作出button了。
键盘的驱动和事件你也能解决了。
有了键盘事件、鼠标事件、文字和矩形,你就可以作出texteditor了。
其实所有像素图都是矩形。在矩形内里组合组多个项目,你就可以作出treeview了。
到这里作出其他控件也不是什么难事。
对于一个具体的UI,就是创建一套从根窗口开始的控件类对象的结点系统。UI中的各个控件类对象,按照父子关系,结成树状结构。然后遍历这个树,执行各个控件类的绘制(drawcall)函数。当然还要有Z缓冲区,控制控件类对象的层叠关系。就这样,UI就被绘制出来了。
Qt就是一个结构良好的、面向对象的,这么一个控件库框架。
参考文档:
可以介绍下你研发的gui框架吗?
如何利用opengl绘制用户界面?