在GTK(或pygtk的或gtkmm的...)
我怎样才能检测到应用程序窗口已经被用户手动调整,如通常通过拖动窗口的边缘呢?
我需要找到一个方法来区分手动从调整大小,从GTK起源,如窗口内容的变化调整大小。
在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的尺寸尝试这样做,它似乎工作无论哪种方式。
在PyGTK的,我一直守候着expose_event
一个窗口大小调整,然后使用get_allocation
方法来获得新的大小。
以我为例,我试图从用户调整整个窗口大小调整一个Gtk.Paned用户之间进行区分。 两个发射的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)
有效地,当用户开始和结束直接与我的小部件交互记录,我可以承担被调整窗口的其余时间所致。 (直到我找到更多的情况下)
您可以通过使用起来扔东西gdk_window_get_root_origin得到窗口的左上角和gdk_window_get_geometry得到的宽度和高度。 然后,你可以将一个回调到GDK_BUTTON_PRESS_MASK和检查,看看是否发生近/窗口边缘的一个按钮按下。
当然,这似乎相当hackish的,它真的困扰我,我无法找到一些简单的方法在文档中的GdkWindow做到这一点。 有一个gdk_window_begin_resize_drag函数,它真的让我觉得有一个更清洁的方式来做到这一点,但我没有看到任何东西比我的回答更明显。