扩展从 UI 文件加载的小部件
Extending a Widget Loaded from a UI File
我希望能够从 .ui
文件中加载一个小部件(在本例中为 QMainWindow),而且还能够扩展 class 以便我可以执行类似的操作捕捉键盘事件。
例如,我有以下内容不起作用但显示了我正在努力完成的事情:
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
并将其基础 class 设置为 QMainWindow
,然后重写 keyPressEvent
方法,但是我必须做所有的代码布局,我更愿意利用 .ui
文件。你是怎么做到的?
要侦听来自其他小部件的事件,您必须使用 eventFilter。此外,初始 window 永远不会显示,因此最好将其替换为 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_())
我希望能够从 .ui
文件中加载一个小部件(在本例中为 QMainWindow),而且还能够扩展 class 以便我可以执行类似的操作捕捉键盘事件。
例如,我有以下内容不起作用但显示了我正在努力完成的事情:
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
并将其基础 class 设置为 QMainWindow
,然后重写 keyPressEvent
方法,但是我必须做所有的代码布局,我更愿意利用 .ui
文件。你是怎么做到的?
要侦听来自其他小部件的事件,您必须使用 eventFilter。此外,初始 window 永远不会显示,因此最好将其替换为 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_())