2013-03-16 74 views
0

我正在研究一個簡單的小部件系統,現在我正在實施一些容器。容器/佈局如何重新定位他們的孩子?

這裏是我發現自己的情況:

  • 我有一個Widget基類,一類Container,這是一個可以包含其它小部件,和幾個小部件的子類,比如Button
  • 我有兩種類型的容器:Container本身,它定位兒童絕對和Box,這將堆疊部件彼此相鄰,水平或垂直。
  • 每個控件在x = 0,y = 0處繪製自己。因此,在小部件被告知繪製自己之前,容器需要爲繪圖上下文添加一個偏移量。
  • 每個小部件根據它的x/y位置進行自己的命中測試。

到目前爲止,它工作正常。但是現在我正在執行Box:我所做的是我覆蓋了從Container繼承的draw函數,將它們全部並排繪製,而不是基於它們的x/y位置。非常簡單。

但事件處理現在完全關閉,因爲小部件的x/y位置已變得毫無意義。

我想我有兩個選擇:

  1. 有小部件的位置x = 0,y = 0的做命中測試,就像畫。然後重新計算鼠標位置以匹配Container中的位置。
  2. 將每個佈局設置爲x/y爲其子項,並讓孩子再次在x/y位置繪製自己。沒有更多的補償的繪圖環境

第一個是有點難看,我認爲。第二個實現起來相當複雜,因爲我需要對小部件中的位置更改做出反應。

如何像Qt,Gtk和wxWidgets等其他小工具系統通常解決這個問題?我已經看過其中一些的來源,但不能完全弄清楚,它太複雜了。我沒有任何重新調整或包裝問題需要考慮。

回答

1

您正試圖實現您自己的佈局系統。你應該期望它很困難。 我會建議反對第一種方法。小部件的x,y座標不僅可以由小部件本身使用,還可以由容器外部任何想使用小部件的人員使用。

第二種解決方案是我選擇實現由幾個較小的小部件組成的自定義小部件,如果您不需要太多的功能,就不難拼在一起。 只需將它們添加到容器時獲取小部件,將它們的位置設置爲當前空閒位置,然後轉到下一個小部件。

相關問題