Перехват кнопки "Закрыть"

Вопросы связанные с работой ГИС Аксиома
Ответить
Аватара пользователя
bgnik
Пользователь
Сообщения: 83
Зарегистрирован: 25 окт 2021, 08:40

Перехват кнопки "Закрыть"

Сообщение bgnik » 19 сен 2025, 04:47

Возможно ли перехватить закрытие главного окна Аксиомы кнопкой "Закрыть" (крестиком), а далее в диалоге дать возможность оператору выбрать, прекращать работу или отказаться от закрытия?
Аватара пользователя
Дмитрий
Администратор
Сообщения: 102
Зарегистрирован: 04 июн 2019, 11:33

Re: Перехват кнопки "Закрыть"

Сообщение Дмитрий » 19 сен 2025, 19:53

Здравствуйте!

Да, технически возможно перехватить закрытие главного окна с помощью установки event-фильтра на главное окно приложения.
Однако мы не рекомендуем использовать такой подход в реальных условиях: он может конфликтовать с внутренней логикой Аксиомы,
в результате чего пользователь увидит два диалоговых окна с вопросом о закрытии подряд — что создаст неудобства и путаницу.

Данный скрипт предлагается запустить один раз из редактора кода python:

Код: Выделить всё

import axipy
from axipy import *
from PySide2.QtCore import *

class CloseFilter(QObject):
    def __init__(self) -> None:
        super().__init__()
        mainwindow.widget.installEventFilter(self)
        
    def eventFilter(self, watched, event) -> False:
        if event.type() == QEvent.Close:
            res = axipy.show_dialog('Закрыть?', 'Заголовок',
                        icon=DlgIcon.QUESTION,
                        default_button = DlgButtons.CANCEL,
                        buttons = DlgButtons.YES_NO_CANCEL)
            if res != DlgButtons.YES:
                event.ignore()
        return False
        
    def uninstall(self):
        mainwindow.widget.removeEventFilter(self)

windowWatcher = CloseFilter()
Аватара пользователя
bgnik
Пользователь
Сообщения: 83
Зарегистрирован: 25 окт 2021, 08:40

Re: Перехват кнопки "Закрыть"

Сообщение bgnik » 23 сен 2025, 07:50

Спасибо, Дмитрий! Как я понял, скрипт запускается один раз и далее его действие распространяется на весь сеанс работы с Аксиомой. Действительно, при закрытии главного окна возникают повторные выводы диалога. Но у меня несколько другая ситуация: после выполнения основного фрагмента техпроцесса пользователь анализирует результаты (а это может занять некоторое время) и, если он удовлетворен ими, иногда забывает запустить завершающий фрагмент и выходит из Аксиомы. Это приводит к тому, что работу приходится выполнять заново. Тут-то и надо перехватить закрытие главного окна: после выполнения основного фрагмента включить перехват, а при выполнении завершающего выключить.
Для проверки я, на основе Вашего скрипта, написал свой тестовый, прикрепляю его к сообщению. Вроде бы все работает, но поскольку это mainwindow, опасаюсь, нет ли каких подводных камней?
И еще: можно ли аналогичным образом перехватывать действие кнопки "Закрыть все" меню "Файл"?
(Уверен, что можно, но что-то никак не получается :? ).
Вложения
my_close_filter.py
(1.33 КБ) 11 скачиваний
Ответить