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).
Писать свой метод для всех виджетов слишком долго и не красиво. Есть ли вариант как отслеживать все события окна?