我也在Qt论坛上发了这篇文章,但是我没有得到任何跟进,所以我希望在这里继续讨论。这是我的帖子和回应的相关部分。
我的帖子:
I有以下设计:一个主窗口,其中有一个小部件,在这个小部件中,可以加载不同类型的"Page“小部件。第一个页面,我们称之为启动页,允许用户输入产品的序列号。然后查询数据库以获取有关产品本身的一些信息,然后创建一个具体的子类,表示" product“的类型。所有子产品类都是从抽象类Product继承的。
基本上,当用户通过输入序列号来选择产品时,会调用一个产品工厂来创建具体的对象,然后检查它是否通过总线物理地连接到系统。然后,这个创建的产品将以类似于时尚的向导的形式传递给其他页面并被其他页面使用。
响应:
我看到的最大的问题..。是ui在驱动你的逻辑。通常情况下,这是一个糟糕的想法,并最终导致在规划阶段难以预见的问题。
我对待它的方式是你的应用程序是一个状态机。有用户输入阶段、产品查找阶段(从描述中可能失败)、产品视图/编辑阶段等。在这些阶段之间的转换将指示ui更改,例如,从产品id输入切换到产品查找将ui页面从输入形式切换到等待指示器,完成查询将移动到成功或失败状态,这将相应地显示错误页或产品页。然后,产品对象将由处理它的状态机状态管理。查找将产生一个对象并将其传递给视图/编辑状态,而当转换到另一个状态时,该状态将释放它。您的逻辑将更好地以这种方式封装,并且独立于ui,您可能希望有一天改变它,或者做出可选的选择,例如在静默模式下驱动状态机、应用程序params或其他东西。ui只会发送一个改变机器状态的信号,例如,输入一个数字就可以将机器从输入转换为查找,这反过来又可以连接到页面更改。
我现在面临的问题是,我没有看到这是如何将我的应用程序逻辑与我的UI分离开来的?QStateMachine将被配置为基于按钮单击在状态之间的转换,这本质上就是将其耦合到我的UI中。如果我想要某种类型的“无头”模式,我基本上必须重新配置我的整个状态机来附加到来自不同对象的信号。我想我可以尝试抽象这一点,方法是让一个构建器类型类根据我所处的模式来配置所有的状态转换。
这可能表明,无论我是否有UI,我都需要某种中间对象,而状态机则连接到来自该对象的信号。然后,我的不同小部件将包含对同一个对象的引用,并利用它。
基本上,当状态机似乎与设计耦合时,我会问如何将状态机与UI分离,因为驱动状态机的是UI本身。
发布于 2022-09-30 09:23:57
QStateMachine类及其相关类不会“通过设计”耦合到UI。它们可以用于在应用程序的任何层实现状态机。
您收到的答复只是主张更好地分离关注点。
正如您已经说过的(关于“无头”模式),您可以将业务逻辑打包到驱动这样一个状态机来处理流程流的组件中。当然,您还可以在UI中使用其他状态机来处理模型更新、用户交互和页面导航。
https://stackoverflow.com/questions/73900612
复制相似问题