PyQt5 focusIN/Out 事件

exd*_*tis 3 python qt pyqt pyqt5

我是第一次使用 Python 3.4 和 Qt 5。这很简单,我可以理解我需要的大部分功能。但是(总有“但是”)我不明白如何使用focusOut//clearFocusfocusIn

我的老方法是对的吗:

QObject.connect(self.someWidget, QtCore.SIGNAL('focusOutEvent()'), self.myProcedure)
Run Code Online (Sandbox Code Playgroud)

...在 Qt5 中不起作用?

我试图理解这一点,但没有成功。我将非常感谢一个简短的例子,当其中一些人QLineEdit失去焦点时如何捕捉事件。

mfi*_*tzp 5

这里的问题是focusInEvent//clearFocus不是focusOutEvent信号,它们是事件处理程序参见此处的示例。如果您想捕获这些事件,您将需要在对象上重新实现事件处理程序,例如通过子类化 QLineEdit。

class MyQLineEdit(QLineEdit):

    def focusInEvent(self, e):
        # Do something with the event here
        super(MyQLineEdit, self).focusInEvent(e) # Do the default action on the parent class QLineEdit
Run Code Online (Sandbox Code Playgroud)

在 PyQt5 中,信号本身的语法更简单。以 QLineEdit 的信号为例textEdited,您可以按如下方式使用它:

self.someWidget.textEdited.connect( self.myProcedure )
Run Code Online (Sandbox Code Playgroud)

这会将信号连接textEdited到您的self.myProcedure方法。目标方法需要接受信号输出,例如:

void    textEdited ( const QString & text )
Run Code Online (Sandbox Code Playgroud)

因此,您可以在您的班级中定义self.myProcedure如下,它将接收QString该信号发送的信号。

def myProcedure(self, t):
    # Do something with the QString (text) object here
Run Code Online (Sandbox Code Playgroud)

您还可以定义自定义信号,如下所示:

from PyQt5.QtCore import QObject, pyqtSignal

class Foo(QObject):
    an_event = pyqtSignal()
    a_number = pyqtSignal(int)
Run Code Online (Sandbox Code Playgroud)

在每种情况下,pyqtSignal都用于定义类的属性Foo,您可以像任何其他信号一样连接到该属性。例如,为了处理上述问题,我们可以创建:

def an_event_handler(self):
    # We receive nothing here

def a_number_handler(self, i):
    # We receive the int
Run Code Online (Sandbox Code Playgroud)

然后您可以按如下方式connect()发送emit()信号:

self.an_event.connect( self.an_event_handler )
self.a_number.connect( self.a_number_handler )

self.an_event.emit()   # Send the signal and nothing else.
self.a_number.emit(1)  # Send the signal wih an int.
Run Code Online (Sandbox Code Playgroud)

您发布的链接提供了有关自定义信号、信号命名和使用新语法重载的更多信息。