PyQt 连接到 KeyPressEvent

问题描述 投票:0回答:3

某些小部件将允许我做:

self.widget.clicked.connect(on_click)

但正在做:

self.widget.keyPressEvent.connect(on_key)

将失败,表明该对象没有属性“connect”。

我知道对小部件进行子类化并重新实现

keyPressEvent
方法将允许我响应事件。但是我如何才能从用户上下文中
.connect()
到键盘事件?

python events pyqt4 signals-slots
3个回答
20
投票
创建自定义信号,并从重新实现的事件处理程序中发出它:

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)

(注意:需要调用基类实现才能保持现有的事件处理)。


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

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

0
投票
这是一个非常古老的问题,所以也许这已经晚了十年,但是您可以通过连接 QLineEdit 上的两个信号来做到这一点。 TextChanged 是在“常规”按键上进行的,当 Enter、Tab 或 QLineEdit 失去焦点时,将调用 EditingFinished。 请参阅此处的文档 -

https://www.pythonguis.com/docs/qlineedit-widget/#connecting-signals-and-slots

search_box.textChanged.connect(self.type_ahead_search) search_box.editingFinished.connect(self.search_signals)
    
© www.soinside.com 2019 - 2024. All rights reserved.