1

在将可编辑的 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() 信号来验证输入. 创建新项目后,如果输入无效,我将再次删除它,并且它还让我有机会添加一个错误弹出窗口,告诉用户输入不是目录。

4

1 回答 1

1

我认为不需要hasFocus(),因为如果您正在写入 QLineEdit 它显然具有焦点。如果路径不正确,则必须返回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_())
于 2018-11-30T13:34:27.067 回答