我正在开发一个简单的小部件系统,我现在正在实现一些容器。
这是我发现自己的情况:
- 我有一个
Widget
基类,一个Container
类,它是一个可以包含其他小部件的小部件,以及几个小部件子类,如Button
. - 我有两种类型的容器:
Container
它自己,它绝对定位孩子,和Box
,它将把小部件堆叠在一起,水平或垂直。 - 每个小部件在 x=0, y=0 处绘制自己。因此,容器需要在小部件被告知绘制自己之前向绘制上下文添加偏移量。
- 每个小部件都根据其 x/y 位置进行自己的命中测试。
到目前为止,它工作正常。但是现在我正在实现它分崩离析Box
:我所做的是我覆盖draw
继承自的函数Container
以将它们全部绘制成彼此相邻,而不是基于它们的 x/y 位置。非常简单。
但是事件处理现在完全关闭了,因为小部件的 x/y 位置变得毫无意义。
我想我有两个选择:
- 让小部件在位置 x=0、y=0 进行命中测试,例如绘图。然后重新计算鼠标位置以匹配
Container
. - 将每个布局设置为其子级设置 x/y,并让子级再次在其 x/y 位置绘制自己。绘图上下文不再有偏移
第一个有点丑,我觉得。第二个实现起来相当复杂,因为我需要对小部件中的位置变化做出反应。
Qt、Gtk 和 wxWidgets 等其他小部件系统通常如何解决这个问题?我已经查看了其中一些的来源,但无法完全弄清楚,它太复杂了。我没有任何调整大小或包装问题需要考虑。