通过 QValidator 验证可编辑的 QCombobox 输入是否是一个目录

Validate if editable QCombobox input is a directory via 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)

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

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

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

也不行。

编辑:它有点工作...但是当我按下 return 时 "hasFocus" 仍然是 True 所以它只是接受输入然后当然将它添加到组合框。如果我摆脱 "if self._input.hasFocus():" 如果我输入它,它不接受任何输入...就像粘贴完整的目录路径一样。 所以我需要的是一种检查编辑是否完成然后检查它是否是目录的方法。 据我所知,我只能通过 QValidator 在组合框中检查它...因为它会立即将输入添加到框中...在我以任何方式拦截它之前。

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

我认为不需要 hasFocus(),因为如果您正在写入 QLineEdit,它显然具有焦点。如果路径不正确,则必须 return a QValidator::Intermediate:

from PySide import QtGui, QtCore

class DirValidator(QtGui.QValidator):
    def validate(self, _text, _pos):
        _dir = QtCore.QDir(_text)
        if _dir.exists():
            return QtGui.QValidator.Acceptable
        return QtGui.QValidator.Intermediate

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    combo = QtGui.QComboBox(editable=True)
    dir_validator = DirValidator(combo.lineEdit())
    combo.setValidator(dir_validator)
    combo.show()
    sys.exit(app.exec_())