使用鼠标在区域(窗口)内滚动来调整gtk2小部件的大小?

时间:2013-11-11 03:51:46

标签: gtk2

我想开发一个小部件容器(仍然在python 2.7和gtk2上),它将被放置在滚动的窗口中,并且可以在窗口中自由移动和调整大小,例如:click&在窗口小部件中拖动会将其移动到窗口内;当窗口小部件的角落/边缘在窗口中可见时,它会显示用于调整大小的拖动控制柄 - 否则,如果它大于窗口区域,则会在中键单击时向上和向下缩放(放大和缩小)。

当然,我希望将此小部件的自定义编码量保持在最低限度,因此我首先考虑gtk2中可用的内容。事实证明,暴露调整大小拖动句柄的元素是gtk.Window - 如果它是主(或根)窗口,那么;否则,如果窗口放在窗口小部件内,其大小显然由窗口小部件设置,因此没有拖动句柄(不是菜单,标题栏等)。我在徘徊为什么会这样 - 而且似乎是由于多个文档界面(MDI)被gtk开发人员认为是邪恶的,例如Re: [gtk-list] Resizing widgets with a mouseDoes GTK support MDI? - Linux/BSD whirlpool.net.au

为了演示我想要的行为,我使用了来自Python PyQt/PySide QMdiArea subwindows scroll not working in TabbedView - Stack Overflow的PyQt4代码,因为事实证明,Qt确实有一个MDI区域。所以这里是它的要点 - 如果角落可见,则会出现调整大小拖动手柄,并且可以启动调整大小拖动操作:

qtdrag1

当您将角落拖到窗口外时 - 滚动条会自动指示内部窗口小部件的新大小/位置(请注意,下面的屏幕截图中的窗口也移动了一些,这是手动和非预期的):

qtdrag2

同样,我真的不需要一个窗口(如在标题栏,菜单中) - 只是一个以这种方式运行的小部件容器,所以我可以放置一个一个表(例如TreeView)或其中的图像,根据情况需要 - 至少不用担心重新计算“外部”滚动条(当然,我希望我必须自己编写其余的自定义行为) 。此外,我现在只需要在窗口中放置一个窗口小部件(因此没有“多个文档”)。

虽然Qt似乎在某种程度上提供了这个,但我现在没有可能进入这样做的水平;对于WxWindows也是如此(参见例如wxPython-users - How to resize Widgets? - 可能,但由于那里没有代码,我无法看到是否需要几何计算编码)。

所以我想知道 - 是否有一个我可能错过的小部件,它会实现上述行为,我可以作为自定义的基础?如果没有,我有什么选择在gtk2上实现类似上面的东西(最终用Python)?

1 个答案:

答案 0 :(得分:0)

我不确定这会奏效,但我建议调查GtkOffscreenWindow;将内部窗口小部件放入其中,并将其呈现为GtkDrawingArea内的GtkScrolledWindow。这可能会使滚动条的行为正常,具体取决于绘图区域的大小。

你不会得到什么:

  • 窗口标题栏,你必须自己渲染,因为GTK不知道它们,它们是窗口管理器的一部分。 (注意,Qt示例中的内部窗口具有与外部窗口不同的标题栏 - 我怀疑这是相同的。)
  • 拖动手柄以调整窗口大小,您必须自己编码,如您所料。

您可能还想看看Glade GUI设计师是如何做到这一点的。