復雜布局的重用,比較容易實現的就是GridLayout,至于FormLayout,基本上如果相似度不是很大,很難重用。我們在實現很多Page的時候,優先考慮的都會是GridLayout。但GridLayout在界面元素改動較大的時候也擁有一些弊端,比之FormLayout要麻煩的多。
當界面元素擁有上下文的時候,隨著其上下文的改變,要想界面元素按照新的上下文重新布局,總是讓人頭疼。因為首先能想到的方法就是隱藏掉不需要的元素,這樣會減少時間和代碼上的開銷。但是如果采用GridLayout布局的時候,一個Widget隱藏的時候,它仍然占用著界面空間,即使將它的hightHint和widthHint設置為0,依然不能解決問題,因為GridLayout通常設置了verticalSpacing和horizontalSpacing。
現在想到的一個解決方案就是將界面元素重新洗牌。 界面元素的生成由Model里的各個元素來決定。界面的上下文都交由一個屬性控制層進行控制,它上承GUI界面,下接業務模型,屬于一個過渡的層次。該層可以裝飾業務模型,并附加上新的上下文,形成一個新的Model。根據這個新的Model,我們在界面上創造元素。如果Model僅僅只是值發生了變化,我們重新設置界面的值即可。如果Model發生了上下文的變化,比如不需要某個屬性了或者是增加一個屬性,我們就對整個界面進行重新洗牌,通過一個循環Dispose掉所有的Widget,然后根據新的上下文重新初始化界面元素,并進行賦值。由于MVC的分離,重新初始化界面是很容易的。對于不太復雜的Page,布局上的問題就可以迎刃而解,而且在時間上的開銷也不會體現得很明顯,至少并看不出顯示上的延遲。