通过QValidator

时间:2018-11-30 12:47:38

标签: python pyside qcombobox qdir qvalidator

在将可编辑的QCombobox输入添加到QCombobox之前,我尝试对其进行验证。

from PySide import QtGui, QtCore

class DirValidator(QtGui.QValidator):
    def __init__(self, cb_input):
        super(DirValidator, self).__init__()
        self._input = cb_input

    def validate(self, _text, _pos):
        _dir = QtCore.QDir(_text)
        if self._input.hasFocus():  # ignore validation while editing not complete
            return QtGui.QValidator.Acceptable
        if QtCore.QDir.exists(_dir):
            return QtGui.QValidator.Acceptable
        return QtGui.QValidator.Invalid


dir_validator = DirValidator(self.cb_path.lineEdit())
self.cb_path.setValidator(dir_validator)

不幸的是,它无法正常工作,因为当我按下Enter键时,每个输入仍然会添加到组合框中。 有什么建议吗?

编辑:我也想像这样在QLineEdit上使用验证器:

dir_validator = DirValidator(self.cb_path.lineEdit())
self.cb_path.lineEdit().setValidator(dir_validator)

也不起作用。

编辑:这有点奏效...但是当我按回车键时,“ hasFocus”仍然为True,因此它只是接受输入,然后当然将其添加到组合框中。如果我摆脱了“ if self._input.hasFocus():”,则我不输入任何输入...只是粘贴完整的目录路径。 所以我需要的是一种检查编辑是否完成的方法,然后检查它是否是目录。 据我了解,我只能通过QValidator在组合框中检查此内容...因为它会立即将输入添加到该框中...之后,我才能以任何方式对其进行拦截。

编辑:我确实找到了解决我案件的方法。我只是放弃了整个验证器方法。这样做的目的是防止组合框不是有效目录时创建新项...我现在要做的是利用QLineEdit()。editingFinished()信号在输入完成后验证输入。创建新项目后,如果输入无效,我再次将其删除,这也使我有机会添加错误弹出窗口,告诉用户输入不是目录。

1 个答案:

答案 0 :(得分:1)

我看不到需要the input device is not a TTY,因为如果您正在编写QLineEdit,显然它会成为重点。如果路径不正确,则必须返回hasFocus()

QValidator::Intermediate