我希望能够从.ui
文件中加载小部件(在本例中为QMainWindow),但也可以扩展该类,以便执行捕获键盘事件之类的事情。
例如,我有以下不起作用,但显示了我要完成的工作:
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
文件。您如何去做?
答案 0 :(得分:0)
要侦听来自其他小部件的事件,必须使用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_())