如题,最近司内的桌面端需求需要转向 Qt 框架,作为一个只接触过 Electron 的前端研发,目前需要学习相关的语言和框架知识,求问各位大佬以及巨佬们,能给我指一条学习路线吗?目前在看油管 Cherno 大佬的 C++入门课程以及组内大佬分享的 Qt 课程,但是自己还是想先列一个计划,规划一下优先学习、重点学习以及可以稍微放一放的内容。
求大佬们不吝赐教哇~
1
tool2d 2023-09-08 11:24:41 +08:00 1
B 站有游戏开发者,大家都说 C++有用,就转头学了 2 个月。两个月后,发现很难学以致用,还是放弃了。选择了脚本语言。
如果只是为了写一个桌面 APP ,有太多别的语言可供选择。 硬转技术路线挺尴尬的,那些写 C++的,很多都是轮子向,都是好多年的积累和习惯。学 C++和前端不一样,学习曲线很陡,得不到很明显的反馈。 |
2
Curtion 2023-09-08 11:29:42 +08:00 1
https://learnxinyminutes.com/ 过一遍语法,然后直接开始动手写, 当然是问 ChatGPT 来操作
|
3
byasm32 2023-09-08 11:31:53 +08:00
找个体量合适的目标,直接复刻,边做边学,进步最快。
纯个人建议。 |
4
centralpark 2023-09-08 11:34:01 +08:00 1
直接 PyQt 啊,整啥 C++
|
5
Nosub 2023-09-08 11:36:03 +08:00 1
把《 C++ GUI Qt4 编程》这本书买回来反复阅读,基础知识不够的可以补充下《 C++ Prime PLUS 》,这样就足够了,这本书《 C++ GUI Qt4 编程》虽然讲的是 QT4 ,不过依然是市面上最好的关于 QT 的书籍,因为是 QT 官方团队写的。
|
6
listenerri 2023-09-08 12:35:54 +08:00 1
Qt 的官方文档已经足够了(英文的),下载 QtCreator 也就是 Qt 官方 IDE ,就开始吧,里面有各种 demo
Qt 能称之为框架是因为 Qt 内部封装好了大量内容,基本上可以当作一门独立的语言来学习,入门学习可以不管 c++,把 c++ 看作是底层/内部实现(当然以后肯定免不了接触 c++ 的,但目前不要被 c++ 挡住学习的脚步,毕竟它公认的难学难用) 如果你没有 c/c++ 底子,更不建议从 c++ 开始学习入门 Qt ,直接学 Qt 里的东西就行了 还有,Qt 早就推出了 Qt Quick 模块(现在已经成熟了),从用法来看是完全独立于以前的 UI 实现模块 QWdiget 的,且对 UI 实现更友好简单,使用时的语言也不是 c++ 了,而是非常类似 js 的 qml 语言,我认为从 Qt Quick 入门应该更适合你 |
7
masterclock 2023-09-08 12:45:20 +08:00
用 QML 写界面,用 python 写其他部分
|
8
objcat 2023-09-08 12:49:21 +08:00
pyqt5 pyside2
|
9
maxxfire 2023-09-08 13:00:27 +08:00
公司用 qt ,是不是要付费购买
|
10
NoOneNoBody 2023-09-08 14:22:22 +08:00 2
有 web 基础的话,做界面不难
qt 可以用 qss ,和 css 有 90%相似,web 前端应该上手很快 难在交互 webUI 和传统客户端 GUI 的区别 1. webUI 是一次提交,GUI 看上去也是一次提交,但实际可能每个控件都有交互,例如 单选按钮可能都要做一次小交互 2. qt 交互需要信道,界面控件发送信号(可以理解为参数),后端接收并处理,所以前后端都要懂,一次交互可以简单理解为一个 xhr (当然这样说不严格),qt 的信号槽要学好 1) webUI 是从提交到界面变化顺序执行,没有界面冻结的概念; GUI 则是界面和程序同时执行,如果顺序执行的话,界面会“冻结”不能操作,俗称“卡”,所以还要懂多线程操作,qthread 算是基础 2) webUI 可以全页面刷新,全换掉也行,GUI 一般只是数据刷新,很少换界面结构,如果界面布局全变一般是切换而不是刷新,就是预作多个界面,切换 focus 3) webUI 的“等待”,用户是可以理解的,一般都默认在等网络传送; GUI 的“等待”,用户是不能理解的,他们默认却是“死机”了,所以做长时间的数据处理时,界面要添加“小动作”,例如滚动条或状态栏定时提示,消除用户的不耐烦 3. webUI 事件很少,一般都是点击、下拉; GUI 事件很多,很复杂,例如比较难的有拖放,树控件操作 建议顺序 1.界面控件 widget 和布局 layer ,不用急着弄整齐漂亮,反正可以 qss 完成(各个控件有名字和 class 属性,以后补上就是了) PS: 初学时,见到名字是 View 结尾或者 Abstract 开头的控件,一律避开,这些属于自定义控件,没有基础就算看文档都会一团乱麻 2.主窗口的关闭、程序的退出(注意在 QT 这是两件事) 3.控件的 connect ,就是发送信号,以及函数怎么接收 4.qthread ,后台线程,先做简单的,例如接收 a ,直接返回 b 就够了,重点是搞清楚进出流程和信号的收发 先做只有一两个 widget 窗口,完成一件事,例如点击按钮在另一个控件显示文字 复杂的界面,就是上述 1/3/4 的组合,当然也有多个 1+一个 3/4 插入、显示图片这些可以先放一放,先学好纯文字,图片这些某角度看,属于媒体文件,qt 需要做一些相关处理 表格、树这些都是复杂的控件,它们之间甚至可以互相引用(混用),因为里面的每个单元格也是一个小型控件,也有相关的点击、选择、按键、拖放……等等,而且数据刷新也复杂(排序之类),整体思路和其他基础控件不同,不要急着搞 qtweb 相关的东西,虽然形式上也是个控件,但实际是个浏览器内核,显示出来倒是简单,但处理其中的网页数据就要另外专门学了,涉及网络、html 分析…… 子窗口、新开窗口就更加不用说了,我至今都能避则避,以后有时间再说 界面和数据之间的桥梁 proxy ,我至今没学会 qt 的状态机可以在搞懂布局和信号之后学,初级的状态机不难学,就是预设好一堆参数而已,这东西很好用,有些固定的状态,设好每个状态的参数,扔进去靠它控制;例如,几个单选按钮,引起界面的小变化(不涉及计算,例如颜色变化),就把这些小变化不同的值扔进状态机,各自标记为某个状态,单选按钮用 connect 发信号(状态的标识)给这个状态机让它来换状态就行了 暂时想到这些…… 这里有 chm 格式的文档(非官方,但也是用官方文档网页版打包的) https://github.com/vzhd1701/qt-documentation-chm-autoupdated |
11
knva 2023-09-08 15:15:45 +08:00 1
用 pyside 吧 。
|
12
nevermoreluo 2023-09-08 15:27:16 +08:00
我自己没写过,不过有几个古老的项目会有维护需求
学我没啥建议,有些坑你可以避一下 逻辑和界面尽量拆开来写,如果逻辑生成一个独立的模块就最好了,在 qt 里面 link 后调用逻辑的方法就好了。(如果可能后续还能拆掉 qt ,逻辑不用动.... 日志这些 io 模块异步很重要(老的有些项目直接同步写文件,卡哭),即使初始没有异步,模块化也很重要,之后好改。 总的来说界面这东西,小公司我不太看好 Qt ,除非组里有很多人都是用 Qt 的 XD :( |
13
cnuser002 2023-09-08 16:57:45 +08:00
桌面程序开发,我觉得最好的入门方式,还是先直接写一个简简单单的小程序,把正式开发时,会接触到的各个地方,先打个照面。就像玩游戏,首先一点点把地图探开,建立传送点。以后跑图做任务就方便了。
比如最开始,放上一个按钮,放上一个 label ,实现点一下 label 显示的数字+1 。这个程序做完,知道控件怎么放进窗口里,变量保存在哪里,如何引用和修改,点击事件如何绑定到控件上。 接着,不用按钮,程序里面跑一个死循环,让这个 label 自己+1 。你会知道在哪里执行这种任务,又如何与 UI 那边交互。 这一步走通了,你就可以再进一步,刚刚是个死循环,现在我换成发送一个 HTTP 请求,收到报文,内容显示到 label 里。涉及到库文件的安装和引用,网络通信,Json 解析等内容。 这部分走通后,开发一个像网页那样获取内容的 GUI 应用,就知道大体怎么做了。 这样我觉得就算入门了。 |
14
liberize 2023-09-08 19:16:58 +08:00 via Android
用 QML 不要用 Widget
|
15
ysc3839 2023-09-08 19:43:28 +08:00 via Android
啥需求?为啥不用 Electron ?
|
16
sosilver 2023-09-08 20:14:18 +08:00 via Android
有前端人员,建议用 qml 。声明式界面+JavaScript 上手难度低、效率高,表现力也很强。
|
17
putaozhenhaochi 2023-09-09 08:41:16 +08:00 via iPhone
c++得喝一壶
|
18
0829ewlLuna OP @ysc3839 原本用的就是 Electron ,但是 Electron 的内存占用问题一直是个老大难,随着业务迭代加快,这问题日渐严重,且由于我只是个业务仔,突然接入框架的学习,是有些不熟悉的,所以我这边得知切换框架的原因大概是这样哈
|
19
0829ewlLuna OP @putaozhenhaochi 已经有体会了,瑟瑟发抖
|
20
0829ewlLuna OP @Nosub 好的好的,谢谢大佬
|
21
0829ewlLuna OP @tool2d 害,么的办法,这个是团队内的决策,我只能跟着做,跟着学
|
22
0829ewlLuna OP @listenerri 好嘞,感谢大佬
|
23
0829ewlLuna OP @NoOneNoBody 感谢大佬详细的回复,我研究研究
|
24
0829ewlLuna OP 在这里统一感谢下各位热情回复的大佬们!!! 8 亏是 V 站,受益良多
|
25
ysc3839 2023-09-11 11:58:26 +08:00 via Android
@0829ewlLuna 个人感觉上 Qt 省不了多少内存,不过我没具体调查过,具体如何不好评价
|
26
NoOneNoBody 2023-09-11 17:36:09 +08:00
忘了提一下,qt 大版本区别还是比较大的,现在 qt4/qt5/qt6 三个大版本都有一些变化,尤其 4 和 5 之间很难移植,5 移植到 6 还好一点,改动不多
看文档不要看最新的,而是看你用的是哪个版本 #12 说得对,后端代码要分拆 我自己有个玩意就是 GUI 和 CLI 用相同的代码计算,把 qt 界面的东西另外写,发送信号 qthread 调用后端计算 平时增加资料用 cli 多(可以批量),读取查找用 GUI 多,因为查出的数据字符串长,cli 再输入麻烦,不如直接点击执行 ============= 顺便说一下 qt 状态机 QtCore.QStateMachine ,帮你省点时间 单个控件的变化没必要用,适用场合就是控件之间的联动 举个例子 有个 checkbox 名为 s ,其属性 checked=True|False 产生两种情况: 另外有 5 个控件(abcde),对应上述两种情况显示或隐藏 定义一个状态机 m ,状态数为 2 , 然后按顺序设定 状态 0 (序号),m.states[0] assignProperty m.states[0].assignProperty(控件, 属性, 值) 添加 a, 属性 visible ,值 True ,再照样添加 b ;分别添加 ced ,属性 visible 为 False 还可以添加自定义属性用于控制数据,但略微复杂,此处略 addTransition 添加 s.clicked 事件跳转到状态 1 (因为这个状态是 0 ,所以这里添加的事件应该是指向其他状态) 还可以添加更多的事件,例如键盘按键、鼠标右键……,此处略 多种状态还能添加不同的事件对应不同的跳转,反正思想就是事件驱动相应变化,此处略 状态 1 assignProperty 添加 a, 属性 visible ,False ,再照样添加 b ;添加 ced ,属性 visible 为 True addTransition 添加 s.clicked 跳转到状态 0 另外还有 entered.connect ,exited.connect 表示进入或离开某个状态时,顺便发送信号执行指定函数,这是进阶用法,将来自己研究吧 然后设定初始状态为 0 (序号) 或者设为为 int(s.isChecked()),相当于由 s 的初始状态决定,这里 True|False 对应 1,0 最后绑定 m 到当前窗口,这样就完成了一个简单状态机 点击 s ,界面就会切换两种状态(uncheck 对应状态 0),一种是只显示 ab ,cde 隐藏;另一种是隐藏 ab ,显示 cde 注意序号,不要 s 的初始状态为 True ,默认状态却设了 0 ,这样两种状态就相反了(当然也可以是本来的目的就是反向) 这是一个很简单的例子,状态机可以做到更为复杂,例如子状态、抽象、轮询等等,也可以绑定到某个控件而不是窗口,这就看个人的想象力和逻辑功力了 状态机也可以纯粹用函数去实现,不是必须的,如果理解不了状态机,也可以用函数逐个控件改变属性 我试过联动几十个属性变化,用函数逐条写累死人,还有漏掉的,自定义类继承状态机,扔一堆参数过去就自行生成比较清晰,因为就算有错漏或者增减变化,也只是改参数的事 |
27
0829ewlLuna OP @NoOneNoBody 再次跪谢大佬的回复,目前切换的版本是 qt5 ,当前在看的文档也是找了对应的版本在看的
|