Расширение виджета, загруженного из файла пользовательского интерфейса - PullRequest
0 голосов
/ 28 февраля 2019

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

Например, у меня есть следующее, которое не работает, но показывает, что я пытаюсь выполнить:

class MyMainWindow(QMainWindow):
    def __init__(self):
        super(MyMainWindow, self).__init__()

        self.window = QUiLoader().load("mainwindow.ui", self)
        self.setCentralWidget(self.window)

        self.window.keyPressEvent = self.key_pressed
        self.window.setEnabled(True)

    def show(self):
        self.window.show()

    def key_pressed(self, event):
        print(event)

Поскольку я не могу расширить объект, загруженный с QUiLoader, я попытался захватитьkeyPressEvent метод в этом объекте, и назначить его для моего собственного key_pressed метода.Это не работает, но я не уверен, как еще захватить события клавиатуры.

Я знаю, что мог бы создать MyMainWindow и установить его базовый класс на QMainWindow, а затем переопределить keyPressEvent метод, но тогда я должен сделать все макет в коде, и я бы предпочел использовать файл .ui.Как ты это делаешь?

1 Ответ

0 голосов
/ 28 февраля 2019

Для прослушивания событий из других виджетов вы должны использовать eventFilter.Также начальное окно никогда не отображается, поэтому лучше заменить его на QObject.

from PySide2 import QtCore, QtWidgets, QtUiTools

class MyApp(QtCore.QObject):
    def __init__(self):
        super(MyApp, self).__init__()
        self.window = QtUiTools.QUiLoader().load("mainwindow.ui")
        self.window.installEventFilter(self)

    def show(self):
        self.window.show()

    def eventFilter(self, obj, event):
        if obj is self.window:
            if event.type() == QtCore.QEvent.KeyPress:
                print(event.key())
        return super(MyApp, self).eventFilter(obj, event)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MyApp()
    w.show()
    sys.exit(app.exec_())
...