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_())