V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
0829ewlLuna
V2EX  ›  程序员

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

  •  
  •   0829ewlLuna · 167 天前 · 1886 次点击
    这是一个创建于 167 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    求大佬们不吝赐教哇~

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

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

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

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

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

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

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

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

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

    这样我觉得就算入门了。
    liberize
        14
    liberize  
       167 天前 via Android
    用 QML 不要用 Widget
    ysc3839
        15
    ysc3839  
       167 天前 via Android
    啥需求?为啥不用 Electron ?
    sosilver
        16
    sosilver  
       167 天前 via Android
    有前端人员,建议用 qml 。声明式界面+JavaScript 上手难度低、效率高,表现力也很强。
    putaozhenhaochi
        17
    putaozhenhaochi  
       166 天前 via iPhone
    c++得喝一壶
    0829ewlLuna
        18
    0829ewlLuna  
    OP
       164 天前
    @ysc3839 原本用的就是 Electron ,但是 Electron 的内存占用问题一直是个老大难,随着业务迭代加快,这问题日渐严重,且由于我只是个业务仔,突然接入框架的学习,是有些不熟悉的,所以我这边得知切换框架的原因大概是这样哈
    0829ewlLuna
        19
    0829ewlLuna  
    OP
       164 天前
    @putaozhenhaochi 已经有体会了,瑟瑟发抖
    0829ewlLuna
        20
    0829ewlLuna  
    OP
       164 天前
    @Nosub 好的好的,谢谢大佬
    0829ewlLuna
        21
    0829ewlLuna  
    OP
       164 天前
    @tool2d 害,么的办法,这个是团队内的决策,我只能跟着做,跟着学
    0829ewlLuna
        22
    0829ewlLuna  
    OP
       164 天前
    @listenerri 好嘞,感谢大佬
    0829ewlLuna
        23
    0829ewlLuna  
    OP
       164 天前
    @NoOneNoBody 感谢大佬详细的回复,我研究研究
    0829ewlLuna
        24
    0829ewlLuna  
    OP
       164 天前
    在这里统一感谢下各位热情回复的大佬们!!! 8 亏是 V 站,受益良多
    ysc3839
        25
    ysc3839  
       164 天前 via Android
    @0829ewlLuna 个人感觉上 Qt 省不了多少内存,不过我没具体调查过,具体如何不好评价
    NoOneNoBody
        26
    NoOneNoBody  
       164 天前
    忘了提一下,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
       164 天前
    @NoOneNoBody 再次跪谢大佬的回复,目前切换的版本是 qt5 ,当前在看的文档也是找了对应的版本在看的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1325 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:37 · PVG 01:37 · LAX 09:37 · JFK 12:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.