在GTK (或pygtk或gtkmm...)中
我要如何检测到应用程序窗口已被用户手动调整大小,通常是通过拖动窗口的边缘完成的?
我需要找到一种方法来区分手动调整大小和源自GTK的调整大小,例如窗口内容的更改。
notify::position
信号。button-press-event
和 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)
通过记录用户开始和结束与我的小部件的交互来有效地推断其余时间是由于调整窗口大小引起的。(直到我找到更多情况)
notify::position
? - buhtznotify::*
事件。这就是我感到困惑的原因。 - buhtzexpose_event
,然后使用get_allocation
方法获取新的大小。你可以使用gdk_window_get_root_origin获取窗口左上角的位置,再使用gdk_window_get_geometry获取宽度和高度,从而拼凑出一个解决方案。然后,你可以将回调函数挂钩到GDK_BUTTON_PRESS_MASK中,并检查按钮是否在窗口的边缘附近/上。
当然,这种方法似乎有些hackish,我真的很困扰,因为我在GdkWindow文档中找不到更简单的方法来实现这一点。虽然有一个gdk_window_begin_resize_drag函数,但它让我认为应该有更简洁的方法来完成这个任务,但我没有看到比我的答案更明显的东西。