Окно определения GTK изменяет размер пользователя
В GTK (или pygtk или gtkmm...)
Как я могу обнаружить, что пользовательское окно было < вручную изменено пользователем, как это обычно делается путем перетаскивания края окна?
Мне нужно найти способ разграничения размеров вручную от размеров, которые исходят из gtk, например, изменения содержимого окна.
Ответы
Ответ 1
Вы пытались подключиться к событию GDK_CONFIGURE?
Отметьте этот пример под
Раздел "Перемещение окна". В примере показано, что обратный вызов делает что-то, когда окно перемещается, но событие configure является объектом catch-all для перемещения, изменения размера и событий порядка стека.
Ответ 2
Мне удалось снять это, наблюдая за 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, и, похоже, он работает в любом случае.
Ответ 3
В PyGTK я всегда наблюдал за expose_event
для изменения размера окна, а затем использовал метод get_allocation
для получения нового размера.
Ответ 4
В моем случае я пытался отличить пользователя от размера 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)
Эффективно, записанный, когда пользователь начал и закончил взаимодействие с моим виджетами напрямую, я мог предположить, что остальное время было связано с изменением размера окна. (Пока не найду больше случаев)
Ответ 5
Возможно, вы сможете что-то выбросить, используя gdk_window_get_root_origin, чтобы получить верхний левый угол окна и gdk_window_get_geometry, чтобы получить ширину и высоту. Затем вы можете подключить обратный вызов в GDK_BUTTON_PRESS_MASK и проверить, нажата ли кнопка рядом с/на одном из краев окна.
Конечно, это кажется довольно хакерским, и мне действительно мешает, что я не могу найти простой способ в документации для GdkWindow, чтобы сделать это. Существует функция gdk_window_begin_resize_drag, которая действительно заставляет меня думать, что есть более чистый способ сделать это, но я не видел ничего более очевидного, чем мой ответ.