Re: [问题] 非兄弟物件之间要怎么沟通?

楼主: OnlyRD (里巷人)   2022-07-14 04:37:27
Qt 已经很久没摸了
但看到你最后一段写
“有许多外部UI需要更新”
感觉就只是利用UI framework的event system可解决
所有的UI framework都会设计event system
用来处理UI update/render/key inputs等等
Qt太久没用但我觉得一定有啦
命名不外乎eventXXX之类的吧
而且理论上会嵌在UI最基础的元件之内
贯穿整个视窗系统的设计
然后可能还得提供filter之类的功能
免得message过多每个元件都狂反应
而且这类设计通常还有一套遍历子元件的逻辑
当你新增UI元件的时候
其实framework老早就把它们串在一起
还规定了他们响应event的流程跟逻辑
如果你还需要自订事件
系统也会有一套自订事件的现成设计
但是imgui那类的framework可能例外
这类小框架可能比较倾向于改变state去重画外观
你最好把Qt好好耐心看一遍教学
基本上这类framework一通百通
几乎都大同小异
即使忘了你也可以猜到怎么做
你用sigslot的方式硬干去更新UI
就表示应该没仔细去读过文件教学
不然就是你把业务逻辑散到各UI去了
表示在设计上也是有点问题
建议你把业务和资料放到最上层app里面
(额外封装成control也行)
提供许多业务slot让元件去connect
每个元件新增都知道自己需要连结什么slot
而UI处理的部分就完全走系统那一套
这样需要更新UI的slot function
只要把讯息send or paot到app的msg queeu
app就会在适当的时候自动派发讯息
给所有挂在他底下的UI物件
处理讯息的逻辑你可以放在UI小物件里
(高概率是什么xxxEventHandler)
这样的好处是什么?
通常app都是global instance
你可以在任何地方取得app
当然就可以取得业务slot和control
每个自订的UI元件可以暴露signal
当在生成所有UI物件的时候
就可以connect(在UI construtor内或app内)
也可以在slot里动态的connect/disconnect
因为slot可以完全知道是谁呼叫的
(有可能需要dynamic cast or object id)
透过sigslot你就把UI串接业务搞定
而业务统一在control or app层处理
处理之后透个系统event system
通知UI遍历传递讯息
UI再由event handler处理update/render/redraw
至于编译速度的问题
由于改动slot内部的程式码
只会让app底下业务的部分重新编译
但是由于slot/signal没有改变
不会重新编译相关的物件
也不会重新编译event system的部分
※ 引述《liu2007 (薯)》之铭言:
: 我的开发平台是 win7
: 工具是QT Creator
: 版本是Qt Core 5.15.2
: 有个问题困扰我很久,不知道该怎么写才好
: 故来请教比较好的写法是什么
: 在开始问问题之前想要说明的是
: 下面我会用到阿公、父亲、儿子的说法其实不是很准确
: 只是单纯我自己用来说明什么class 包含 什么 class的用词
: 如果造成混淆请见谅。
: 例如 class Father里面有一个class Child 的 property
: 而 class GramPa 里面有一个 class Father 的 property
: 以下自行理解的解决方法是素人方法
: 太菜还请见谅
: 如果两个Child物件要沟通没有问题
: 把一方的signal和slot给connect()起来就好
: 这也是最基础的写法。
: 只要知道两个Child的pointer就好。
: 如果是祖孙沟通
: 对于 Father 来说
: 就必须要有 GramPa 和 Child的pointer才能进行connect
: 对 Father 来说,Child 是自己制造或是本来自己的 property所以没问题
: GramPa 的话
: 1.除非本来就有写一个 getParent()来认亲,要不然
: 2.只能一开始在生成 Father的时候在建构子里面塞 GramPa 的pointer
: 3.或者是如果 GramPa 伟大到整个program只会有一个 GramPa 的话
: 也可以用 singleton来取得 GramPa 的pointer
: 但如果祖孙的距离不只一层呢?
: 如果是上述的方法1或方法2
: 会变成每一层都多一个parent pointer 的 field
: 每一层的建构子都要都要多塞一个parent的pointer,在new 的时候也要把this丢进去
: 然后每一层的slot都只干一件事情,就是emit signal给上层
: 这样一来写了一堆很重复很累赘的程式码只为了传递一个讯号
: 取名也很头痛,通常会取很相近的名字,
: 如果这之中有bug出现,还要定睛去看到底是哪一层传错,很累。
: 似乎只能用上述的方法3 singleton,也就变成必须要include GramPa.h
: 程式多多少少搞得臃肿,如果GramPa.h有改的话还拖累编译的速度
: 我不知道我问的是否清楚(因为我要上班了,有点慌乱在乱打文章)
: 我的程式有很多那种某个小功能按钮按下去之后要叫很外面的UI做动作的地方
: 想知道该怎么做比较好
: 感谢阅读
作者: milkdragon (谢谢大家!!)   2022-07-16 09:55:00
说得很好,推~

Links booklink

Contact Us: admin [ a t ] ucptt.com