PyQt5 focusIN / Out事件

时间:2015-03-01 12:17:43

标签: python qt pyqt pyqt5

我第一次使用Python 3.4和Qt 5。它很简单,我可以理解我需要的大部分功能。但是(总是"但是")我不明白如何使用focusOut / clearFocus / focusIn事件。

我说得对吗:

QObject.connect(self.someWidget, QtCore.SIGNAL('focusOutEvent()'), self.myProcedure)

...在Qt5中不起作用?

我试图理解this失败了。我非常感谢一个简短的例子,例如,当许多QLineEdit中的一些{{1}}失去焦点时,如何捕捉事件。

2 个答案:

答案 0 :(得分:2)

此处的问题是focusInEvent / clearFocus / focusOutEvent 不是信号,它们是事件处理程序。请参阅示例here。如果要捕获这些事件,则需要在对象上重新实现事件处理程序,例如通过继承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

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

self.someWidget.textEdited.connect( self.myProcedure )

这会将您的self.myProcedure功能与textEdited信号相关联。目标函数需要接受事件输出,例如:

void    textEdited ( const QString & text )

因此,您可以按如下方式在班级中定义self.myProcedure,并收到该活动发送的QString

def myProcedure(self, t):
    # Do something with the QString (text) object here

您还可以按如下方式定义自定义事件:

from PyQt5.QtCore import QObject, pyqtSignal

class Foo(QObject):
    an_event = pyqtSignal()
    a_number = pyqtSignal(int)

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

def an_event_handler(self):
    # We receive nothing here

def a_number_handler(self, i):
    # We receive the int

然后您可以connect()emit()事件如下:

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

self.an_event.emit()   # Send the event and nothing else.
self.a_number.emit(1)  # Send the event an an int.

您发布的链接提供more information on custom events,信号命名和使用新语法重载。

答案 1 :(得分:0)

我花了一段时间才弄明白这个问题,所以我想我会把它贴在这里以帮助遇到这个问题的其他人。它在 Python 3.9.6 和 PyQt 6.1.2 中。

这会在小部件聚焦时更改小部件的颜色,在失焦时再次更改。

import sys
from PyQt6 import QtWidgets


class Main(QtWidgets.QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("Qt Testing")
        self.setGeometry(0, 0, 640, 120)

        h = QtWidgets.QHBoxLayout()

        w = ColorQLineEdit("one")
        h.addWidget(w)

        w = ColorQLineEdit("two")
        h.addWidget(w)

        self.setLayout(h)


class ColorQLineEdit(QtWidgets.QLineEdit):

    def focusInEvent(self, event):
        print("in")
        self.setStyleSheet("background-color: yellow; color: red;")
        super().focusInEvent(event)

    def focusOutEvent(self, event):
        print("out")
        self.setStyleSheet("background-color: white; color: black;")
        super().focusOutEvent(event)


app = QtWidgets.QApplication(sys.argv)
main = Main()
main.show()
sys.exit(app.exec())