2009-09-12 40 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

相關問題