[虚心求教] 关于前端研发如何以正确姿势入门 C++以及 Qt 框架 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
0829ewlLuna
V2EX    程序员

[虚心求教] 关于前端研发如何以正确姿势入门 C++以及 Qt 框架

  •  
  •   0829ewlLuna 2023-09-08 11:15:04 +08:00 3836 次点击
    这是一个创建于 811 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,最近司内的桌面端需求需要转向 Qt 框架,作为一个只接触过 Electron 的前端研发,目前需要学习相关的语言和框架知识,求问各位大佬以及巨佬们,能给我指一条学习路线吗?目前在看油管 Cherno 大佬的 C++入门课程以及组内大佬分享的 Qt 课程,但是自己还是想先列一个计划,规划一下优先学习、重点学习以及可以稍微放一放的内容。

    求大佬们不吝赐教哇~

    27 条回复    2023-09-11 17:42:21 +08:00
    tool2d
        1
    tool2d  
       2023-09-08 11:24:41 +08:00   1
    B 站有游戏开发者,大家都说 C++有用,就转头学了 2 个月。两个月后,发现很难学以致用,还是放弃了。选择了脚本语言。

    如果只是为了写一个桌面 APP ,有太多别的语言可供选择。

    硬转技术路线挺尴尬的,那些写 C++的,很多都是轮子向,都是好多年的积累和习惯。学 C++和前端不一样,学习曲线很陡,得不到很明显的反馈。
    Curtion
        2
    Curtion  
       2023-09-08 11:29:42 +08:00   1
    https://learnxinyminutes.com/ 过一遍语法,然后直接开始动手写, 当然是问 ChatGPT 来操作
    byasm32
        3
    byasm32  
       2023-09-08 11:31:53 +08:00
    找个体量合适的目标,直接复刻,边做边学,进步最快。
    纯个人建议。
    centralpark
        4
    centralpark  
       2023-09-08 11:34:01 +08:00   1
    直接 PyQt 啊,整啥 C++
    Nosub
        5
    Nosub  
       2023-09-08 11:36:03 +08:00   1
    把《 C++ GUI Qt4 编程》这本书买回来反复阅读,基础知识不够的可以补充下《 C++ Prime PLUS 》,这样就足够了,这本书《 C++ GUI Qt4 编程》虽然讲的是 QT4 ,不过依然是市面上最好的关于 QT 的书籍,因为是 QT 官方团队写的。
    listenerri
        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 入门应该更适合你
    masterclock
        7
    masterclock  
       2023-09-08 12:45:20 +08:00
    用 QML 写界面,用 python 写其他部分
    objcat
        8
    objcat  
       2023-09-08 12:49:21 +08:00
    pyqt5 pyside2
    maxxfire
        9
    maxxfire  
       2023-09-08 13:00:27 +08:00
    公司用 qt ,是不是要付费购买
    NoOneNoBody
        10
    NoOneNoBody  
       2023-09-08 14:22:22 +08:00   3
    有 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
    knva
        11
    knva  
       2023-09-08 15:15:45 +08:00   1
    用 pyside 吧 。
    nevermoreluo
        12
    nevermoreluo  
       2023-09-08 15:27:16 +08:00
    我自己没写过,不过有几个古老的项目会有维护需求
    学我没啥建议,有些坑你可以避一下

    逻辑和界面尽量拆开来写,如果逻辑生成一个独立的模块就最好了,在 qt 里面 link 后调用逻辑的方法就好了。(如果可能后续还能拆掉 qt ,逻辑不用动....

    日志这些 io 模块异步很重要(老的有些项目直接同步写文件,卡哭),即使初始没有异步,模块化也很重要,之后好改。
    总的来说界面这东西,小公司我不太看好 Qt ,除非组里有很多人都是用 Qt 的 XD :(
    cnuser002
        13
    cnuser002  
       2023-09-08 16:57:45 +08:00
    桌面程序开发,我觉得最好的入门方式,还是先直接写一个简简单单的小程序,把正式开发时,会接触到的各个地方,先打个照面。就像玩游戏,首先一点点把地图探开,建立传送点。以后跑图做任务就方便了。

    比如最开始,放上一个按钮,放上一个 label ,实现点一下 label 显示的数字+1 。这个程序做完,知道控件怎么放进窗口里,变量保存在哪里,如何引用和修改,点击事件如何绑定到控件上。

    接着,不用按钮,程序里面跑一个死循环,让这个 label 自己+1 。你会知道在哪里执行这种任务,又如何与 UI 那边交互。

    这一步走通了,你就可以再进一步,刚刚是个死循环,现在我换成发送一个 HTTP 请求,收到报文,内容显示到 label 里。涉及到库文件的安装和引用,网络通信,Json 解析等内容。

    这部分走通后,开发一个像网页那样获取内容的 GUI 应用,就知道大体怎么做了。

    这样我觉得就算入门了。
    liberize
        14
    liberize  
       2023-09-08 19:16:58 +08:00 via Android
    用 QML 不要用 Widget
    ysc3839
        15
    ysc3839  
       2023-09-08 19:43:28 +08:00 via Android
    啥需求?为啥不用 Electron ?
    sosilver
        16
    sosilver  
       2023-09-08 20:14:18 +08:00 via Android
    有前端人员,建议用 qml 。声明式界面+Javascript 上手难度低、效率高,表现力也很强。
    putaozhenhaochi
        17
    putaozhenhaochi  
       2023-09-09 08:41:16 +08:00 via iPhone
    c++得喝一壶
    0829ewlLuna
        18
    0829ewlLuna  
    OP
       2023-09-11 10:17:56 +08:00
    @ysc3839 原本用的就是 Electron ,但是 Electron 的内存占用问题一直是个老大难,随着业务迭代加快,这问题日渐严重,且由于我只是个业务仔,突然接入框架的学习,是有些不熟悉的,所以我这边得知切换框架的原因大概是这样哈
    0829ewlLuna
        19
    0829ewlLuna  
    OP
       2023-09-11 10:18:18 +08:00
    @putaozhenhaochi 已经有体会了,瑟瑟发抖
    0829ewlLuna
        20
    0829ewlLuna  
    OP
       2023-09-11 10:19:24 +08:00
    @Nosub 好的好的,谢谢大佬
    0829ewlLuna
        21
    0829ewlLuna  
    OP
       2023-09-11 10:20:06 +08:00
    @tool2d 害,么的办法,这个是团队内的决策,我只能跟着做,跟着学
    0829ewlLuna
        22
    0829ewlLuna  
    OP
       2023-09-11 10:20:43 +08:00
    @listenerri 好嘞,感谢大佬
    0829ewlLuna
        23
    0829ewlLuna  
    OP
       2023-09-11 10:22:11 +08:00
    @NoOneNoBody 感谢大佬详细的回复,我研究研究
    0829ewlLuna
        24
    0829ewlLuna  
    OP
       2023-09-11 10:26:11 +08:00
    在这里统一感谢下各位热情回复的大佬们!!! 8 亏是 V 站,受益良多
    ysc3839
        25
    ysc3839  
       2023-09-11 11:58:26 +08:00 via Android
    @0829ewlLuna 个人感觉上 Qt 省不了多少内存,不过我没具体调查过,具体如何不好评价
    NoOneNoBody
        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 ,这样两种状态就相反了(当然也可以是本来的目的就是反向)

    这是一个很简单的例子,状态机可以做到更为复杂,例如子状态、抽象、轮询等等,也可以绑定到某个控件而不是窗口,这就看个人的想象力和逻辑功力了

    状态机也可以纯粹用函数去实现,不是必须的,如果理解不了状态机,也可以用函数逐个控件改变属性
    我试过联动几十个属性变化,用函数逐条写累死人,还有漏掉的,自定义类继承状态机,扔一堆参数过去就自行生成比较清晰,因为就算有错漏或者增减变化,也只是改参数的事
    0829ewlLuna
        27
    0829ewlLuna  
    OP
       2023-09-11 17:42:21 +08:00
    @NoOneNoBody 再次跪谢大佬的回复,目前切换的版本是 qt5 ,当前在看的文档也是找了对应的版本在看的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     943 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:48 PVG 05:48 LAX 13:48 JFK 16:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86