0

我正在开发一个简单的小部件系统,我现在正在实现一些容器。

这是我发现自己的情况:

  • 我有一个Widget基类,一个Container类,它是一个可以包含其他小部件的小部件,以及几个小部件子类,如Button.
  • 我有两种类型的容器:Container它自己,它绝对定位孩子,和Box,它将把小部件堆叠在一起,水平或垂直。
  • 每个小部件在 x=0, y=0 处绘制自己。因此,容器需要在小部件被告知绘制自己之前向绘制上下文添加偏移量。
  • 每个小部件都根据其 x/y 位置进行自己的命中测试。

到目前为止,它工作正常。但是现在我正在实现它分崩离析Box:我所做的是我覆盖draw继承自的函数Container以将它们全部绘制成彼此相邻,而不是基于它们的 x/y 位置。非常简单。

但是事件处理现在完全关闭了,因为小部件的 x/y 位置变得毫无意义。

我想我有两个选择:

  1. 让小部件在位置 x=0、y=0 进行命中测试,例如绘图。然后重新计算鼠标位置以匹配Container.
  2. 将每个布局设置为其子级设置 x/y,并让子级再次在其 x/y 位置绘制自己。绘图上下文不再有偏移

第一个有点丑,我觉得。第二个实现起来相当复杂,因为我需要对小部件中的位置变化做出反应。

Qt、Gtk 和 wxWidgets 等其他小部件系统通常如何解决这个问题?我已经查看了其中一些的来源,但无法完全弄清楚,它太复杂了。我没有任何调整大小或包装问题需要考虑。

4

1 回答 1

1

您正在尝试实现自己的布局系统。你应该预料到这会很困难。我建议不要使用第一种方法。小部件的 x,y 坐标不仅由小部件本身使用,而且由容器外部想要对小部件做某事的任何人使用。

第二种解决方案是我选择实现由几个较小的小部件组成的自定义小部件,如果您不想要太多功能,将其组合起来并不难。只需在将小部件添加到您的容器时获取它们,将它们的位置设置为当前空闲位置,然后继续下一个。

于 2013-03-16T09:12:21.467 回答