PySide:在带有输入掩码的 QLineEdit 中单击时,将光标位置重置为 0
PySide: reset cursor pos to 0 when clicking in QLineEdit in with input-mask
我正在尝试使用 QLineEdit 通过输入掩码输入六个数字,但问题是当用户在行编辑中单击时,光标位置正是您单击的位置。
我正在努力确保它将位置重置为开头。我读过类似的问题 - 以及它们的答案 - 但我无法让它工作(其中很多都是在 C++ 中,并且因为我缺乏它的经验,所以我无法复制代码 Python).
我能够安装一个事件过滤器来识别用户何时单击进入 QLineEdit,并且我能够打印用户在单击时设置的光标位置。但是当我尝试手动将其设置为 0 时,它不起作用。好吧,它确实有效,但前提是包含 QLineEdit 的整个应用程序失去焦点并且用户返回它。所以在某种程度上,我正在寻找一种方法 refresh/repaint 过滤器 class 内的整个应用程序。
class Filter(QObject):
def eventFilter(self, widget, event):
# FocusIn event
if event.type() == QEvent.FocusIn:
print 'focus in'
widget.setCursorPosition(0)
return False
else:
return False
这会将光标位置设置为0,但在实际应用中只有当我Alt+Tab或整个window失去焦点并再次获得焦点时才会显示。 widget/window 的手动 repaint()/update() 什么都不做。
我认为正确的行为应该是在行编辑为空时始终将光标放在开头。否则,它应该出现在用户点击的任何地方,因为他们可能想在那个位置编辑特定字符。
这是一个实现该功能的简单演示:
import sys
from PySide import QtCore, QtGui
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
layout = QtGui.QVBoxLayout(self)
while layout.count() < 2:
edit = QtGui.QLineEdit(self)
edit.setInputMask('999999')
edit.installEventFilter(self)
layout.addWidget(edit)
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.MouseButtonPress:
if not len(source.text()):
source.home(False)
return True
return super(Window, self).eventFilter(source, event)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
我正在尝试使用 QLineEdit 通过输入掩码输入六个数字,但问题是当用户在行编辑中单击时,光标位置正是您单击的位置。
我正在努力确保它将位置重置为开头。我读过类似的问题 - 以及它们的答案 - 但我无法让它工作(其中很多都是在 C++ 中,并且因为我缺乏它的经验,所以我无法复制代码 Python).
我能够安装一个事件过滤器来识别用户何时单击进入 QLineEdit,并且我能够打印用户在单击时设置的光标位置。但是当我尝试手动将其设置为 0 时,它不起作用。好吧,它确实有效,但前提是包含 QLineEdit 的整个应用程序失去焦点并且用户返回它。所以在某种程度上,我正在寻找一种方法 refresh/repaint 过滤器 class 内的整个应用程序。
class Filter(QObject):
def eventFilter(self, widget, event):
# FocusIn event
if event.type() == QEvent.FocusIn:
print 'focus in'
widget.setCursorPosition(0)
return False
else:
return False
这会将光标位置设置为0,但在实际应用中只有当我Alt+Tab或整个window失去焦点并再次获得焦点时才会显示。 widget/window 的手动 repaint()/update() 什么都不做。
我认为正确的行为应该是在行编辑为空时始终将光标放在开头。否则,它应该出现在用户点击的任何地方,因为他们可能想在那个位置编辑特定字符。
这是一个实现该功能的简单演示:
import sys
from PySide import QtCore, QtGui
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
layout = QtGui.QVBoxLayout(self)
while layout.count() < 2:
edit = QtGui.QLineEdit(self)
edit.setInputMask('999999')
edit.installEventFilter(self)
layout.addWidget(edit)
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.MouseButtonPress:
if not len(source.text()):
source.home(False)
return True
return super(Window, self).eventFilter(source, event)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())