我的UI元素和模型对象应该具有什么级别的分离?

时间:2011-01-03 00:12:42

标签: c++ model-view-controller qt

我正在QT中构建​​一个桌面应用程序(虽然这可能无关紧要),但我正在努力完成类结构和布局。数据模型非常简单,根容器包含多个容器容器。请考虑以下表示:

Root
+ Parent
  + Child

UI非常简单,并且遵循该数据模型,主窗口带有可滚动区域(根),小部件包含带有一些标签和按钮的自定义小部件(子)的布局(父级)。

我的麻烦在于处理需要上链的事件然后退回,例如将孩子从一个父母移动到另一个父母,移动元素,或更新影响几个到多个其他小部件的子元数据。

我目前正在拆分UI小部件和模型对象,但让每个小部件和相应的模型对象彼此指向并感觉很麻烦,我认为这导致了太多的维护。

2 个答案:

答案 0 :(得分:5)

我建议遵循标准的MVC模式,并确保模型与视图之间没有依赖关系;在您的情况下,这意味着虽然每个模型项都有一个小部件,但模型项不会引用其相应的小部件。

虽然MVC模式有很多种,但实现此目的的一种方法是使视图类监视模型以进行任何更改并相应地更新视图(这可以通过将视图类中的插槽连接到从模型类发出的信号)。用户通过视图启动的任何更改都可以是:

1)由模型直接处理    通过一个简单的信号/槽    连接
2)处理    通过控制器类可以    指示模型相应更新

其中任何一个都会导致模型发出更新信号,导致视图更新。这样做的好处是无需更新模型即可更改视图(或添加其他视图)。

我建议阅读Qt's Model/View Programming Guide以更好地了解MVC如何在Qt中运行,并查看是否存在可以使用的现有类或接口(例如QAbstractItemModel),而不是烘焙自己的类。

答案 1 :(得分:0)

考虑使用工厂模式和命令模式。有很多样本。我只是在这里给出一个提示。

http://en.wikipedia.org/wiki/Factory_method_pattern

http://en.wikipedia.org/wiki/Command_pattern

忘记提及qt书:cartan-cas-dot-suffolk-dot-edu / oopdocbook / html /