Вопрос по – Изменение размера окна обнаружения GTK от пользователя

17

В GTK (или pygtk или gtkmm ...)

Как я могу обнаружить, что окно приложения былоmanually изменяется пользователем, как это обычно делается перетаскиванием края окна?

Мне нужно найти способ отличить размеры ручного изменения от размеров, которые происходят от gtk, например, изменения в содержимом окна.

Нет. Если я это сделаю, он появится здесь. Drew Dormann
Вы нашли способ сделать это? clahey

Ваш Ответ

5   ответов
8

Проверять, выписыватьсяэтот пример под & quot; Перемещение окна & quot; раздел. В этом примере показано, как обратный вызов делает что-то, когда окно перемещается, но событие configure является универсальным для событий перемещения, изменения размера и порядка стека.

Я думаю, что вы можете использовать & quot; check-resize & quot; вместо этого «настроить событие»
@ Шон, можешь ли ты дать ответ, который работает? Drew Dormann
Для этого работает следующий код: g_signal_connect (G_OBJECT (окно), «configure-event», G_CALLBACK (callback_func), NULL);
Но это не обеспечивает способ проверить, какой тип события произошел: изменить его размер или переместить. Поэтому, безусловно, если пользователь не найдет способ определить это, это приведет к ложным результатам. @boldnik: В соответствии с этим это не будет работать, так как срабатывает по разным причинам:ubuntuforums.org/…
7

size_allocate а такжеsize_request сигналы наGtkWindow, Еслиsize_request когда-нибудь стало меньше, я позвонилresize(1,1), Еслиsize_allocate когда-либо был больше, чем ожидалось, я выключил систему.

Одна вещь, с которой я позаботился, былаsize_request возвращаясь большим, потом маленьким и имеяsize_allocate будь большим, а потом маленьким. Я не знаю, возможно ли это, но я исправил это, убедившись, что только ожидаемые значения уменьшаются только дляsize_allocate когда я получил меньшеsize_allocate, не когда я получил меньшеsize_request.

Убедитесь, что вашsize_request обработчик идет после базового класса & apos; обработчик, чтобы вы получили правильные значения. Я сделал это, переопределив метод, а затем вызвав метод базового класса.

Я пробовал это как в 1, так и в 2 измерениях, и, похоже, это работает в любом случае.

3

expose_event для изменения размера окна, затем используйтеget_allocation способ получить новый размер.

Я смотрю на структуру GdkEventExpose ... это поле send_event, которое сообщит мне, что это сделал пользователь? Drew Dormann
На самом деле, вы, вероятно, хотите event_configure, а не event_expose ... мой плохой. Я думаю, что это требует как перемещений, так и изменения размеров, поэтому вам придется помнить предыдущий размер, если это все, что вас интересует.
0

gdk_window_get_root_origin чтобы получить верхний левый угол окна иgdk_window_get_geometry чтобы получить ширину и высоту. Затем вы можете подключить обратный вызов к GDK_BUTTON_PRESS_MASK и проверить, происходит ли нажатие кнопки рядом с одним из краев окна или на нем.

Конечно, это кажется довольно хакерским, и меня действительно беспокоит то, что я не смог найти какой-то простой способ в документации для GdkWindow сделать это. Eстьgdk_window_begin_resize_drag функция, котораяreally заставляет меня думать, что есть более чистый способ сделать это, но я не видел ничего более очевидного, чем мой ответ.

3

изменяющего размер Gtk.Paned, от пользователя, изменяющего размер всего окна. Оба испустилиnotify::position сигнал.

Мое решение было, так как я не могу знать, изменяет ли пользователь размер окна из виджета, изменить то, что я хотел знать. Запишите, если пользователь переместил виджет, и проигнорируйте обновления, если пользователь не инициировал их в моем виджете.

То есть вместо проверки «изменяется ли размер окна»; Я записалbutton-press-event а такжеbutton-release-event"локально, чтобы я мог вместо этого проверить" переместился ли виджет "& quot;

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)

По факту записи, когда пользователь начинал и заканчивал взаимодействовать с моим виджетом напрямую, я мог предположить, что остальное время было связано с изменением размера окна. (Пока не найду больше дел)

Где в справочнике по API можно найтиnotify::position?
Это умно ... Drew Dormann
@ThorSummoner В документах я нигде не могу найтиnotify::* событие. Вот почему мне интересно.
@ Buhtz Я думаю, что наткнулся на "уведомить :: & lt; тип & gt;" пример в дикой природе, и я предположил остальное для удивительных Документов PGI Лазки:lazka.github.io/pgi-docs/#Gtk-3.0/classes/Paned.html

Похожие вопросы