PyQt连接到KeyPressEvent

jpc*_*cgt 8 python events signals-slots pyqt4

某些小部件允许我这样做:

self.widget.clicked.connect(on_click)
Run Code Online (Sandbox Code Playgroud)

但做:

self.widget.keyPressEvent.connect(on_key)
Run Code Online (Sandbox Code Playgroud)

将失败说该对象没有属性'connect'.

我知道对窗口小部件进行子类化并重新实现该keyPressEvent方法将允许我响应该事件.但是,如何.connect()从用户上下文中获取键盘事件或以其他方式说出来?

ekh*_*oro 10

创建自定义信号,并从重新实现的事件处理程序中发出它:

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)
Run Code Online (Sandbox Code Playgroud)

(注意:为了保持事件的现有处理,需要调用基类实现).


chr*_*ris 5

我过去这样做的方式是(这是一种解决方法),这是在发送方中,接收方声明/连接到信号。

def keyPressEvent(self, event):
    if type(event) == QtGui.QKeyEvent:
        if event.key() == QtCore.Qt.Key_Space:
            self.emit(QtCore.SIGNAL('MYSIGNAL'))
Run Code Online (Sandbox Code Playgroud)