容器/布局如何重新定位他们的孩子?

时间:2013-03-16 06:53:19

标签: qt user-interface gtk wxwidgets

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

以下是我发现自己的情况:

  • 我有一个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位置绘制自己。没有更多的绘图上下文偏移
  3. 我认为第一个有点难看。第二个实现起来相当复杂,因为我需要对小部件中的位置变化作出反应。

    如何对Qt,Gtk和wxWidgets等其他小部件系统进行解决?我看过其中一些的来源,但不能完全弄明白,它太复杂了。我没有任何调整大小或包装问题需要考虑。

1 个答案:

答案 0 :(得分:1)

您正在尝试实施自己的布局系统。你应该期待它很难。 我建议不要使用第一种方法。窗口小部件的x,y坐标不仅由窗口小部件本身使用,而且还由容器外部的任何人使用,以便对窗口小部件执行某些操作。

第二个解决方案是我选择实现由几个较小的小部件组成的自定义小部件,如果你不需要太多的功能,它就不难拼凑起来。 只需将小部件添加到容器中,将其位置设置为当前空闲位置,然后转到下一个位置。