Отслеживание событий клавиатуры и мыши на всем окне pyqt5

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

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QAbstractItemView, QMainWindow, QApplication
import sys


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(600, 400)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(10, 10, 256, 201))
        self.listWidget.setObjectName("listWidget")
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        self.list_2 = QtWidgets.QListWidget(self.centralwidget)
        self.list_2.setGeometry(QtCore.QRect(280, 10, 256, 201))
        self.list_2.setObjectName("list_2")
        item = QtWidgets.QListWidgetItem()
        self.list_2.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.list_2.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.list_2.addItem(item)
        MainWindow.setCentralWidget(self.centralwidget)
        self.toolBar = QtWidgets.QToolBar(MainWindow)
        self.toolBar.setObjectName("toolBar")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        __sortingEnabled = self.listWidget.isSortingEnabled()
        self.listWidget.setSortingEnabled(False)
        item = self.listWidget.item(0)
        item.setText(_translate("MainWindow", "первый1"))
        item = self.listWidget.item(1)
        item.setText(_translate("MainWindow", "второй1"))
        item = self.listWidget.item(2)
        item.setText(_translate("MainWindow", "третий1"))
        self.listWidget.setSortingEnabled(__sortingEnabled)
        __sortingEnabled = self.list_2.isSortingEnabled()
        self.list_2.setSortingEnabled(False)
        item = self.list_2.item(0)
        item.setText(_translate("MainWindow", "первый2"))
        item = self.list_2.item(1)
        item.setText(_translate("MainWindow", "второй2"))
        item = self.list_2.item(2)
        item.setText(_translate("MainWindow", "третий2"))
        self.list_2.setSortingEnabled(__sortingEnabled)
        self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))


class MyWidget(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.installEventFilter(self)

        self.list_2.setDragDropMode(QAbstractItemView.DragDrop)
        self.list_2.setDefaultDropAction(Qt.MoveAction)
        self.listWidget.setDragDropMode(QAbstractItemView.DragDrop)
        self.listWidget.setDefaultDropAction(Qt.MoveAction)

    def eventFilter(self, obj, event):
        if event.type() == QEvent.MouseButtonPress:
            print('press')

        return super().eventFilter(obj, event)


def except_hook(cls, exception, traceback):
    sys.__excepthook__(cls, exception, traceback)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyWidget()
    ex.show()
    sys.excepthook = except_hook

    app.exec()
    sys.exit()

Так вот проблема в том, что когда я привязываю метод к окну, то он не вызывается если события происходят на виджете (Qlistwiget).

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


Ответы (0 шт):