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控件 实现拖入文件时自动显示文件路径