GTK检测从用户调整窗口大小

GTK检测从用户调整窗口大小,gtk,signals,resize,Gtk,Signals,Resize,在GTK(或pygtk或gtkmm…)中 如何检测应用程序窗口已由用户手动调整大小,这通常是通过拖动窗口边缘来实现的 我需要找到一种方法来区分手动调整大小和源自gtk的调整大小,例如窗口内容的更改。在PyGTK中,我一直在关注窗口调整的expose\u事件,然后使用get\u allocation方法获取新的大小。您是否尝试连接到GDK\u CONFIGURE事件 在下面结账 “移动窗口”部分。该示例显示了一个回调在移动窗口时执行某些操作,但配置事件是一个用于移动、调整大小和堆栈顺序事件的综合事

在GTK(或pygtk或gtkmm…)中

如何检测应用程序窗口已由用户手动调整大小,这通常是通过拖动窗口边缘来实现的


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

在PyGTK中,我一直在关注窗口调整的
expose\u事件,然后使用
get\u allocation
方法获取新的大小。

您是否尝试连接到GDK\u CONFIGURE事件

在下面结账
“移动窗口”部分。该示例显示了一个回调在移动窗口时执行某些操作,但配置事件是一个用于移动、调整大小和堆栈顺序事件的综合事件。

您可以通过使用获取窗口的左上角并获取宽度和高度来将一些内容组合在一起。然后,您可以将回调挂接到GDK_BUTTON_PRESS_掩码中,并检查按钮按下是否发生在窗口的某个边缘附近/上


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

我通过观察
GtkWindow
上的
size\u分配
size\u请求
信号成功地实现了这一点。如果
size\u请求
变得更小,我会调用
resize(1,1)
。如果
size\u allocate
比预期的要大,我就关闭了系统

我确保处理的一件事是
size\u请求
先返回大的,然后返回小的,然后让
size\u分配
先大后小。我不知道这是否可行,但我修复了它,确保只有当我得到一个较小的
size\u allocate
时,才降低
size\u allocate
的预期值,而不是当我得到一个较小的
size\u请求时

确保
size\u请求的
处理程序位于基类的处理程序之后,以便获得正确的值。为此,我先重写该方法,然后调用基类方法


我在1维和2维两个维度上都尝试过这个方法,但它似乎都能起作用。

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

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

也就是说,我没有测试“窗口是否被调整大小”,而是在本地记录了
按钮按下事件和
按钮释放事件,这样我就可以测试“小部件是否被重新定位”

从gi.repository导入Gtk
类别MyPaned(Gtk.Paned):
_用户激活=错误
def on_位置(自、自、gparamspec):
如果激活了self.\u user\u:
#小部件触摸
其他:
#窗口大小调整(可能)
def on_按钮_按下(自身,*_):
self.\u user\u activated=True
def on_按钮_释放(自身,*41;:
self.\u user\u activated=False
开发初始化(self,*args):
super(MyPaned,self)。\uuuu init\uuuuu(*args)
self.connect('notify::position',self.on_position)
自我连接(“按钮按下事件”,自我打开按钮按下)
自连接(“按钮释放事件”,自启动按钮释放)

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

我正在查看GdkEventExpose结构…是发送事件字段告诉我是用户做的吗?实际上,您可能希望配置事件,而不是事件公开。。。我的错。我认为移动和调整大小都需要这样做,所以如果你感兴趣的话,你必须记住之前的大小。你找到了一种方法吗?没有。如果我找到了,它会显示在这里。下面的代码适用于此:g_信号连接(g_对象(窗口),“配置事件”,g_回调(回调函数),NULL;我认为您可以使用“检查调整大小”而不是“配置事件”,但这并没有提供一种方法来检查发生了什么类型的事件:调整大小或移动。因此,如果用户没有找到某种方法来确定这一点,那么肯定会产生虚假的结果@boldnik:根据这一点,这将不起作用,因为它会激发其他各种原因:给定的链接已失效,编辑队列已满。下面是给出的示例的当前链接:在API参考中哪里可以找到
notify::position
?@buhtz我想我在野外偶然发现了一个“notify::”示例,我推断了Lazka令人敬畏的PGI文档的其余部分:@thorCaller在文档中我找不到
notify:*
事件。这就是我想知道的原因。建议的编辑队列是full@ThorSummoner是的,我想在您的代码片段中添加python3语法高亮显示,但SE告诉我您答案的编辑队列已满。