2009-09-12 55 views
2

我正在编写一个用于绘制窗口小部件/菜单/控件等的应用程序来创建应用程序模型。每个屏幕都表示为小部件的集合,并且每个小部件都是简单的类,例如如何为窗口小部件解耦模型/视图

class Model(object): 
    def __init__(self): 
     self.widgets = [] 

class Widget(object): 
    def __init__(self): 
     self.x, self.y = 0, 0 
     self.w, self.h = 100,20 
     self.text = "Widget" 

现在,用户可以在编辑器中编辑X,Y,W,H,它呈现的许多意见(的地方),渲染本身可能会改变W和H,因为我们想至少表明最合适的。 例如文本“窗口小部件”可能需要宽度不同的看法

200或205

问:

所以问题渲染/视图本身modifes模型,如何避免这种情况?现在我有主视图和主模型,如果想渲染副本模型并渲染它,则可以使用任何其他视图,从而避免主模型中的更改。

这种方法很简单,代码仍然很简单,但需要一个不必要的模型副本,我想过很多方法来避免这种情况,但是所有这些方法都会使代码变得复杂,并且可能效率不高,因为无论如何,如果模型没有被复制,渲染时间 - 属性需要放置在某个地方,例如在每个窗口小部件的每个渲染器中。

我在python中实现它,但这与答案无关。

回答

2

如果唯一的事情是,在模型渲染的变化是X,Y,W,H,那么你有几种选择:

  1. 复制这些字段:X,Y,W,H和x_drawn,y_drawn等。渲染可以改变_drawn值,并让你的模型不介意它们已经改变。例如,保存模型时,不要保存_drawn值。然后这些模型可以在渲染过程中改变,但这并不重要。

  2. 将x,y,w,h移到RenderedGeometry类中,并给每个模型一个实例。现在您仍然可以复制模型,但它可以是浅拷贝,再加上RenderedGeometry类的新副本,从而减少您需要复制的数量。

  3. 将字段复制到x_original,y_original字段集合中。在渲染之前,将x,y复制到_original字段中。渲染后,将它们复制回来。模型实例本身不需要复制,只需要少量的数据。

+0

+1 3点的选择,但我认为所有这三个将复杂的代码,号码1本来很有前途,但我做的线程渲染也将意味着我可能需要x_drawn每个渲染器,这将事情进一步复杂化 – 2009-09-12 13:05:11

相关问题