GTK检测窗口从用户调整(GTK detecting window resize from the

2019-06-24 11:03发布

在GTK(或pygtk的或gtkmm的...)

我怎样才能检测到应用程序窗口已经被用户手动调整,如通常通过拖动窗口的边缘呢?

我需要找到一个方法来区分手动从调整大小,从GTK起源,如窗口内容的变化调整大小。

Answer 1:

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

看看这个例子中的“移动窗口”部分。 这个例子显示了一个回调做的事情时,移动窗口,但配置事件是一个包罗万象的移动,调整大小和堆叠顺序的事件。



Answer 2:

我设法通过观察来退出这个功能size_allocatesize_request信号上GtkWindow 。 如果size_request曾经得到更小,我叫resize(1,1) 如果size_allocate是有史以来大于预期,我把系统关闭。

有一两件事我确信处理是size_request返回大,那么小,并具有size_allocate是很大的,然后小。 我不知道这是可能的,但我通过确保只降低了预期值固定它size_allocate当我得到一个较小的size_allocate ,而不是当我得到了一个较小的size_request

请确保您的size_request让您得到正确的价值观来处理基类的处理程序后。 我通过重写方法,然后先调用基类的方法,这样做。

我已经在这两个1点2的尺寸尝试这样做,它似乎工作无论哪种方式。



Answer 3:

在PyGTK的,我一直守候着expose_event一个窗口大小调整,然后使用get_allocation方法来获得新的大小。



Answer 4:

以我为例,我试图从用户调整整个窗口大小调整一个Gtk.Paned用户之间进行区分。 两个发射的notify::position信号。

我的解决办法,因为我不知道,如果用户从窗口小部件调整窗口大小,扭转什么,我想知道。 记录如果用户重新定位窗口小部件并忽略更新,如果用户没有主动他们对我的小部件。

也就是说,不是测试“如果被调整窗口中的”我记录的button-press-eventbutton-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)

有效地,当用户开始和结束直接与我的小部件交互记录,我可以承担被调整窗口的其余时间所致。 (直到我找到更多的情况下)



Answer 5:

您可以通过使用起来扔东西gdk_window_get_root_origin得到窗口的左上角和gdk_window_get_geometry得到的宽度和高度。 然后,你可以将一个回调到GDK_BUTTON_PRESS_MASK和检查,看看是否发生近/窗口边缘的一个按钮按下。

当然,这似乎相当hackish的,它真的困扰我,我无法找到一些简单的方法在文档中的GdkWindow做到这一点。 有一个gdk_window_begin_resize_drag函数,它真的让我觉得有一个更清洁的方式来做到这一点,但我没有看到任何东西比我的回答更明显。



文章来源: GTK detecting window resize from the user