1

我正在尝试使用 QLineEdit 输入带有输入掩码的六个数字,但问题是当用户单击行编辑时,光标位置正是您单击的位置。

我正在努力确保它将位置重置为开始。我已经阅读了类似的问题 - 以及对它们的答案 - 但我无法让它工作(其中很多都在 C++ 中,并且因为我缺乏使用它的经验,我无法在 Python 中复制代码)。

我能够安装一个事件过滤器来识别用户何时单击 QLineEdit,并且我能够打印用户单击时设置的光标位置。但是当我尝试手动将其设置为 0 时,它不起作用。好吧,它确实有效,但前提是包含 QLineEdit 的整个应用程序失去焦点并且用户返回它。所以在某种程度上,我正在寻找一种方法来刷新/重绘 Filter 类中的整个应用程序。

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 或整个窗口丢失并再次获得焦点时显示。小部件/窗口的手动重绘()/更新()什么都不做。

4

1 回答 1

0

如果行编辑为空,我认为正确的行为应该是始终将光标放在开头。否则,它应该转到用户单击的任何位置,因为他们可能想要编辑该位置的特定字符。

这是一个实现该功能的简单演示:

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_())
于 2016-11-04T17:31:00.250 回答