18

在 GTK(或 pygtk 或 gtkmm...)

如何检测到应用程序窗口已被用户手动调整大小,通常通过拖动窗口边缘来完成?

我需要找到一种方法来区分手动调整大小和源自 gtk 的调整大小,例如窗口内容的更改。

4

5 回答 5

8

您是否尝试连接到 GDK_CONFIGURE 事件?

在“移动窗口”部分查看此示例。该示例显示了在移动窗口时执行某些操作的回调,但配置事件是移动、调整大小和堆栈顺序事件的全部。

于 2009-08-12T16:33:57.393 回答
7

我设法size_allocate通过size_requestGtkWindow. 如果size_request变小了,我打电话给resize(1,1)。如果size_allocate比预期的要大,我就关闭了系统。

我确保要处理的一件事是先size_request大后小,size_allocate先大后小。我不知道这是否可能,但我通过确保仅size_allocate在我得到一个较小的size_allocate时候而不是在我得到一个更小的size_request.

确保您的size_request处理程序位于基类的处理程序之后,以便您获得正确的值。我通过重写方法然后首先调用基类方法来做到这一点。

我已经在 1 维和 2 维中尝试过,它似乎都可以工作。

于 2009-08-25T22:20:28.493 回答
5

在我的情况下,我试图区分用户调整 Gtk.Paned 的大小和用户调整整个窗口的大小。两人都发出了notify::position信号。

我的解决方案是,因为我不知道用户是否正在从小部件调整窗口大小,所以反转我想知道的内容。记录用户是否重新定位了小部件,如果用户没有在我的小部件上启动更新,则忽略更新。

也就是说,我没有测试“如果窗口被调整大小”,而是在本地记录了button-press-eventand button-release-event,所以我可以测试“如果小部件被重新定位”

from gi.repository import Gtk

class MyPaned(Gtk.Paned):
    _user_activated = False

    def on_position(self, _, gparamspec):
        if self._user_activated:
            # widget touched

        else:
            # window resized (probably)

    def on_button_press(self, *_):
        self._user_activated = True

    def on_button_release(self, *_):
        self._user_activated = False


    dev __init__(self, *args):
        super(MyPaned, self).__init__(*args)
        self.connect('notify::position', self.on_position)
        self.connect('button-press-event', self.on_button_press)
        self.connect('button-release-event', self.on_button_release)

通过记录用户开始和结束直接与我的小部件交互的时间,我可以假设其余时间是由于调整了窗口大小。(直到我找到更多案例)

于 2016-07-07T22:41:23.133 回答
4

在 PyGTK 中,我一直关注expose_event窗口调整大小,然后使用该get_allocation方法获取新大小。

于 2009-06-29T19:39:06.713 回答
0

您可以通过使用gdk_window_get_root_origin来获取窗口的左上角并使用gdk_window_get_geometry来获取宽度和高度来将一些东西放在一起。然后,您可以将回调挂钩到 GDK_BUTTON_PRESS_MASK 并检查按钮按下是否发生在窗口边缘之一附近/上。

当然,这看起来很老套,我真的很困扰,因为我在 GdkWindow 的文档中找不到一些简单的方法来做到这一点。有一个gdk_window_begin_resize_drag函数真的让我觉得有一种更清洁的方法可以做到这一点,但我没有看到比我的答案更明显的东西。

于 2009-08-13T17:54:43.743 回答