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 ,这样两种状态就相反了(当然也可以是本来的目的就是反向)
这是一个很简单的例子,状态机可以做到更为复杂,例如子状态、抽象、轮询等等,也可以绑定到某个控件而不是窗口,这就看个人的想象力和逻辑功力了
状态机也可以纯粹用函数去实现,不是必须的,如果理解不了状态机,也可以用函数逐个控件改变属性
我试过联动几十个属性变化,用函数逐条写累死人,还有漏掉的,自定义类继承状态机,扔一堆参数过去就自行生成比较清晰,因为就算有错漏或者增减变化,也只是改参数的事