Duš*_*vić 4 python events pyqt python-3.x
这很可能是一个重复的问题,但我不得不问它,因为其他答案对我来说没有帮助,因为我是 pyqt 的新手(几天前从 tkinter 转换而来)。
我想知道是否可以连接到这样的小部件事件:
self.lineEdit = QtGui.QLineEdit(self.frame)
self.lineEdit.keyReleaseEvent(lambda: someFunction(QtCore.Qt.Key_A ))
self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
self.horizontalLayout.addWidget(self.lineEdit)
Run Code Online (Sandbox Code Playgroud)
进而...
def someFunction(event):
print(event)
...
Run Code Online (Sandbox Code Playgroud)
我的问题是如何从另一个小部件绑定到特定事件,并将该事件与类似函数的btn.clicked.connect(function_goes_here).
在 tkinter 它是这样的:
self.Entry.bind("<KeyRelease-a>", lambda event: someFunction(event))
Run Code Online (Sandbox Code Playgroud)
有许多不同的方法可以实现这一点。侦听给定小部件的所有事件的通用方法是在其上安装事件过滤器。所有受保护的函数都有相应的事件类型,可以通过这种方式访问:
class MainmWindow(QMainWindow):
def __init__(self):
...
self.lineEdit = QLineEdit(self.frame)
self.lineEdit.installEventFilter(self)
def eventFilter(self, source, event):
if source is self.lineEdit:
if event.type() == QEvent.KeyRelease:
print('key release:', event.key())
# the following line will eat the key event
# return True
return super(MainmWindow, self).eventFilter(source, event)
Run Code Online (Sandbox Code Playgroud)
或者,您可以对小部件进行子类化,重新实现相关的事件处理程序,并发出自定义信号:
class LineEdit(QLineEdit):
keyReleased = pyqtSignal(int)
def keyReleaseEvent(self, event):
self.keyReleased.emit(event.key())
super(LineEdit, self).keyReleaseEvent(event)
class MainmWindow(QMainWindow):
def __init__(self):
...
self.lineEdit = LineEdit(self.frame)
self.lineEdit.keyReleased.connect(self.handleKeyRelease)
def handleKeyRelease(self, key):
print('key release:' key)
Run Code Online (Sandbox Code Playgroud)
对此的一个更骇人听闻的变体是直接覆盖该方法:
class MainmWindow(QMainWindow):
def __init__(self):
...
self.lineEdit = QLineEdit(self.frame)
self.lineEdit.keyReleaseEvent = self.handleKeyRelease
def handleKeyRelease(self, event):
print('key release:', event.key())
QLineEdit.keyReleaseEvent(self.lineEdit, event)
Run Code Online (Sandbox Code Playgroud)
请注意,如果您不想调用默认事件处理,则可以省略对基类方法的调用。
| 归档时间: |
|
| 查看次数: |
1864 次 |
| 最近记录: |