在 GTK(或 pygtk 或 gtkmm...)
如何检测到应用程序窗口已被用户手动调整大小,通常通过拖动窗口边缘来完成?
我需要找到一种方法来区分手动调整大小和源自 gtk 的调整大小,例如窗口内容的更改。
您是否尝试连接到 GDK_CONFIGURE 事件?
在“移动窗口”部分查看此示例。该示例显示了在移动窗口时执行某些操作的回调,但配置事件是移动、调整大小和堆栈顺序事件的全部。
我设法size_allocate
通过size_request
在GtkWindow
. 如果size_request
变小了,我打电话给resize(1,1)
。如果size_allocate
比预期的要大,我就关闭了系统。
我确保要处理的一件事是先size_request
大后小,size_allocate
先大后小。我不知道这是否可能,但我通过确保仅size_allocate
在我得到一个较小的size_allocate
时候而不是在我得到一个更小的size_request
.
确保您的size_request
处理程序位于基类的处理程序之后,以便您获得正确的值。我通过重写方法然后首先调用基类方法来做到这一点。
我已经在 1 维和 2 维中尝试过,它似乎都可以工作。
在我的情况下,我试图区分用户调整 Gtk.Paned 的大小和用户调整整个窗口的大小。两人都发出了notify::position
信号。
我的解决方案是,因为我不知道用户是否正在从小部件调整窗口大小,所以反转我想知道的内容。记录用户是否重新定位了小部件,如果用户没有在我的小部件上启动更新,则忽略更新。
也就是说,我没有测试“如果窗口被调整大小”,而是在本地记录了button-press-event
and 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)
通过记录用户开始和结束直接与我的小部件交互的时间,我可以假设其余时间是由于调整了窗口大小。(直到我找到更多案例)
在 PyGTK 中,我一直关注expose_event
窗口调整大小,然后使用该get_allocation
方法获取新大小。
您可以通过使用gdk_window_get_root_origin来获取窗口的左上角并使用gdk_window_get_geometry来获取宽度和高度来将一些东西放在一起。然后,您可以将回调挂钩到 GDK_BUTTON_PRESS_MASK 并检查按钮按下是否发生在窗口边缘之一附近/上。
当然,这看起来很老套,我真的很困扰,因为我在 GdkWindow 的文档中找不到一些简单的方法来做到这一点。有一个gdk_window_begin_resize_drag函数真的让我觉得有一种更清洁的方法可以做到这一点,但我没有看到比我的答案更明显的东西。