QLineEdit 上的活动休假

Posted

技术标签:

【中文标题】QLineEdit 上的活动休假【英文标题】:Event leave on QLineEdit 【发布时间】:2020-06-07 00:25:35 【问题描述】:

如果用户在 QLineEdit 中键入文本并离开 QLineEdit 输入字段,我想执行一些操作。

关于focusInEvent 的解释不多。我正在使用 Python 和 PySide2。但所有信息都在帮助。

def check_focus(self, event):
    print('Focus in event')
    # Way one I tried
    if QtGui.QFocusEvent.lostFocus(self.LE_sample_input_01):
         if self.LE_sample_input_01.text():
             print("Lost focus") 

    # Way two I tried
    if event.type() == QtCore.QEvent.FocusIn:
        if self.LE_sample_input_01.text():
            print(f"Lost focus")

    # Way three I tried
    if self.LE_sample_input_01.focusInEvent(event)

带有两个 QLineEdits 的简单示例

所以可以留下一个条目

from PySide2 import QtWidgets, QtCore, QtGui
from PySide2.QtGui import QIcon


class QTApp(QtWidgets.QWidget):
    def __init__(self):
        super(QTApp, self).__init__()

        self.LE_sample_input_01 = QtWidgets.QLineEdit()
        self.LE_sample_input_02 = QtWidgets.QLineEdit()

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.LE_sample_input_01)
        layout.addWidget(self.LE_sample_input_02)
        self.setLayout(layout)

    def check_focus(self, event):
        print('focus out event')
        # if QtGui.QFocusEvent.lostFocus(self.LE_client_name):
        #     print("lost focus") self.LE_client_name.focusInEvent(event)
        if event.type() == QtCore.QEvent.FocusIn:
            if self.LE_sample_input_01.text():
                print(f"Lost focus")

if __name__ == '__main__':
    app = QtWidgets.QApplication()
    qt_app = QTApp()
    qt_app.show()
    app.exec_()

【问题讨论】:

请提供minimal reproducible example @eyllanesc 你还想要什么?我已经提供了最重要的代码? 这里根据你的观点我们不需要最重要的代码,这里需要MRE。 什么是 MRE?我不知道需要调用的确切方法,这是我的问题。 我需要的是我可以测试的代码,请阅读我给你的链接 【参考方案1】:

check_focus 方法不存在,所以它显然不起作用。如果你想监听来自另一个 QObject(如 QWidet)的事件,那么你应该使用eventFilter

from PySide2 import QtWidgets, QtCore, QtGui


class QTApp(QtWidgets.QWidget):
    def __init__(self):
        super(QTApp, self).__init__()

        self.LE_sample_input_01 = QtWidgets.QLineEdit()
        self.LE_sample_input_02 = QtWidgets.QLineEdit()

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.LE_sample_input_01)
        layout.addWidget(self.LE_sample_input_02)

        self.LE_sample_input_01.installEventFilter(self)
        self.LE_sample_input_02.installEventFilter(self)

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.FocusIn:
            print("FocusIn")
            if obj is self.LE_sample_input_01:
                print("LE_sample_input_01")
            elif obj is self.LE_sample_input_02:
                print("LE_sample_input_02")
        elif event.type() == QtCore.QEvent.FocusOut:
            print("FocusOut")
            if obj is self.LE_sample_input_01:
                print("LE_sample_input_01")
            elif obj is self.LE_sample_input_02:
                print("LE_sample_input_02")
        return super(QTApp, self).eventFilter(obj, event)


if __name__ == "__main__":
    app = QtWidgets.QApplication()
    qt_app = QTApp()
    qt_app.show()
    app.exec_()

【讨论】:

非常感谢您的回答!我自己无法想出这个结构,所以理解 EventFilter 的语法对我很有帮助。您介意添加指向您从中获取该信息的任何资源的链接吗?为什么返回super(QTApp, self).eventFilter(obj, event)。此外,事件过滤器是否会使应用程序在不断检查时变慢? @BenjaminK 1)我已经添加了文档,2)过滤器不仅用于侦听,还用于拒绝事件,因此必须返回布尔值(阅读文档以获取更多信息),并不删除我返回的默认行为与返回父类相同。 3)“如果”不耗时,因此它不应该减慢任何速度,如果发生这种情况,那么错误可能在代码的另一部分,GUI中的代码不应该非常耗时,如果有是耗时的任务,那么它们必须在另一个线程上运行。 由于文档是用 C++ 编写的,对于像我这样对 python 有基本了解的人来说很难阅读。此示例中的事件似乎是一个高级主题,但非常有趣。感谢您尝试使它对我来说更直观。 @BenjaminK 将其视为伪代码,仅记录它(文本),因为它非常准确

以上是关于QLineEdit 上的活动休假的主要内容,如果未能解决你的问题,请参考以下文章

更新从读取字典的 for 循环生成的 QLineEdit 文本框中的文本

PyQt5 QLineEdit控件 实现拖入文件时自动显示文件路径

PyQt5 QLineEdit控件 实现拖入文件时自动显示文件路径

PyQt5 QLineEdit控件 实现拖入文件时自动显示文件路径

PyQt5 QLineEdit控件 实现拖入文件时自动显示文件路径

在 QLineEdit returnpressed() 时从 QLineEdit 获取文本以附加到 QTextEdit