某些小部件将允许我执行:
self.widget.clicked.connect(on_click)
但是做:
self.widget.keyPressEvent.connect(on_key)
如果对象没有属性'connect',将会失败。
我知道子类化widget并重新实现keyPressEvent
方法将使我能够响应该事件。但是之后如何.connect()
到键盘事件,或者换句话说,从用户上下文中如何做?
某些小部件将允许我执行:
self.widget.clicked.connect(on_click)
但是做:
self.widget.keyPressEvent.connect(on_key)
如果对象没有属性'connect',将会失败。
我知道子类化widget并重新实现keyPressEvent
方法将使我能够响应该事件。但是之后如何.connect()
到键盘事件,或者换句话说,从用户上下文中如何做?
创建一个自定义信号,并从您重新实现的事件处理程序中发出它:
class MyWidget(QtGui.QWidget):
keyPressed = QtCore.pyqtSignal(int)
def keyPressEvent(self, event):
super(MyWidget, self).keyPressEvent(event)
self.keyPressed.emit(event.key())
...
def on_key(key):
# test for a specific key
if key == QtCore.Qt.Key_Return:
print('return key pressed')
else:
print('key pressed: %i' % key)
self.widget.keyPressed.connect(on_key)
(注意:为了保留已有的事件处理方式,调用基类实现是必需的。)
__init__
并调用父类的 __init__
吗? - wesanyer__init__
方法。但是如果您确实重写了__init__
,那么您还需要显式地调用基类的实现(因为它将不再被自动调用)。 - ekhumoro我过去处理这个问题的方法是(这是一个解决办法),在发送方中声明/连接信号,在接收方中也声明/连接信号。
def keyPressEvent(self, event):
if type(event) == QtGui.QKeyEvent:
if event.key() == QtCore.Qt.Key_Space:
self.emit(QtCore.SIGNAL('MYSIGNAL'))