2017-07-28 72 views
1

这是最有可能重复的问题,但我不得不问,因为其他答案没有帮助我的情况,因为我是pyqt(从tkinter前几天转换)的新手。将keyRelease事件连接到PyQt4小部件

我想知道是否有可能像>

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) 

,然后用小部件事件连接...

def someFunction(event): 
    print(event) 
    ... 

我的问题是如何绑定特定事件时窗口小部件,并连接该事件与功能...像btn.clicked.connect(function_goes_here)

在tkinter它是这样的:

self.Entry.bind("<KeyRelease-a>", lambda event: someFunction(event)) 

简单的工作示例将是巨大的,如果可能的话

回答

1

有许多不同的方式来实现这一目标。一个通用的方法来听所有事件特定窗口小部件,是install an event-filter它:

class MainmWindow(QtGui.QMainWindow): 
    def __init__(self): 
     ... 
     self.lineEdit = QtGui.QLineEdit(self.frame) 
     self.lineEdit.installEventFilter(self) 

    def eventFilter(self, source, event): 
     if source is self.lineEdit: 
      if event.type() == QtCore.QEvent.KeyRelease: 
       print('key release:', event.key()) 
       # the following line will eat the key event 
       # return True 
     return super(MainmWindow, self).eventFilter(source, event) 

或者,你可以子类中的小部件,再落实相关事件处理程序,并发出一个自定义信号:

class LineEdit(QtGui.QLineEdit): 
    keyReleased = QtCore.pyqtSignal(int) 

    def keyReleaseEvent(self, event): 
     self.keyReleased.emit(event.key()) 
     super(LineEdit, self).keyReleaseEvent(event) 

class MainmWindow(QtGui.QMainWindow): 
    def __init__(self): 
     ... 
     self.lineEdit = LineEdit(self.frame) 
     self.lineEdit.keyReleased.connect(self.handleKeyRelease) 

    def handleKeyRelease(self, key): 
     print('key release:' key) 

在此更hackish的变化是直接改写方法:

class MainmWindow(QtGui.QMainWindow): 
    def __init__(self): 
     ... 
     self.lineEdit = QtGui.QLineEdit(self.frame) 
     self.lineEdit.keyReleaseEvent = self.handleKeyRelease 

    def handleKeyRelease(self, event): 
     print('key release:', event.key()) 
     QtGui.QLineEdit.keyReleaseEvent(self.lineEdit, event) 

注意如果您不想调用默认事件处理,则可以省略对基类方法的调用。

+0

我喜欢这个hackish的方式:D,但我还有一个问题。是否可以绑定两个键,如“Ctrl + a”或其他组合,因为此键释放事件返回两个键代码,一个用于“Ctrl”,另一个用于“a”?或者有另一个意图使用的事件,而不是'keyRelase',为此目的 –

+1

@DušanAtanacković。所有你需要的是一个简单的if语句来检查你喜欢的任何键组合:'if event.modifiers()== QtCore.Qt.ControlModifier and event.key()== QtCore.Qt.Key_A:'。 – ekhumoro

+0

我知道这个问题与以前没有关系,但我想知道你使用的是什么操作系统,因为这个问题与我正在开发的程序有关(为了好玩)。我想要制作的程序就像快速安装程序的Linux,所以我想知道如果你是有趣的项目,你可以在这里检查它,如果你想https://github.com/Dusan92Atanackovic/luqi.git 问候 –