Pyside uiLoader захватывает сигналы закрытия событий - PullRequest
0 голосов
/ 10 октября 2018

Как правильно захватить событие close, исходящее из установки PySide QtUiTools.QUiLoader ()?

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

В идеале я хочу, чтобы все закрытые вызовы проходили через мой closeEvent (очевидно), чтобы я мог гарантировать, что безопасно закрыть окно.Но так как мой self.closeEvent () привязан к моему представлению (QtWidgets.QMainWindow), а не к self._qt.closeEvent (), я не знаю, как добраться до метода self._qt.closeEvent (), чтобы переопределить егов этом случае.

Или есть лучший способ настроить это для захвата этих событий окна?

# Compatible enough with Pyside 2
from PySide import QtGui as QtWidgets
from PySide import QtUiTools
from PySide import QtCore

class View(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(View, self).__init__(parent=parent)
        self.setup()

    def closeEvent(self, event):

        # Do things
        event.accept()

    def setup(self):
        loader = QtUiTools.QUiLoader()
        fy = QtCore.QFile('example.ui')
        fy.open(QtCore.QFile.ReadOnly)
        self._qt = loader.load(fy, self)
        fy.close()

        self._qt.pCanceled.clicked(self._qt.close)

Не применяется:

PySide/ PyQt определяет, пытается ли пользователь закрыть окно

Закрыть, но PySide не использует пользовательский интерфейс PyQt и работает по-другому (и не работает):

PyQt: нажатие X не вызывает closeEvent

1 Ответ

0 голосов
/ 10 октября 2018

closeEvent - это не сигнал, это метод, который вызывается при отправке события QCloseEvent.Сигнал и событие - это разные вещи.Возвращаясь к проблеме, в Qt есть 2 способа прослушивания событий, первый переписывает методы fooEvent(), а второй использует фильтр событий, как показано ниже:

from PySide import QtGui as QtWidgets
from PySide import QtUiTools
from PySide import QtCore

class View(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(View, self).__init__(parent=parent)
        self._qt = None
        self.setup()

    def closeEvent(self, event):
        self.do_things()
        super(View, self).closeEvent(event)

    def do_things(self):
        print("do_things")

    def setup(self):
        loader = QtUiTools.QUiLoader()
        fy = QtCore.QFile('example.ui')
        fy.open(QtCore.QFile.ReadOnly)
        self._qt = loader.load(fy, self)
        fy.close()
        self._qt.pCanceled.clicked.connect(self._qt.close)
        self._qt.installEventFilter(self)

    def eventFilter(self, watched, event):
        if watched is self._qt and event.type() == QtCore.QEvent.Close:
            self.do_things()
        return super(View, self).eventFilter(watched, event)


if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = View()
    w.show()
    sys.exit(app.exec_())

Обновление:

Обычно в eventFilter достаточно вернуть True, чтобы событие было проигнорировано, но в случае QCloseEvent вы должны проигнорировать событие и вернуть True, как показано ниже:

def eventFilter(self, watched, event):
    if watched is self._qt and event.type() == QtCore.QEvent.Close:
        self.do_things()
        event.ignore()
        return True
    return super(View, self).eventFilter(watched, event)
...