Проверьте, является ли редактируемый ввод QCombobox каталогом через QValidator - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь проверить, является ли редактируемый вход 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 (). EditFinished ().,После того, как он создал новый Предмет, я просто удалил его снова, если ввод был недействительным, и это также дало мне возможность добавить всплывающее сообщение об ошибке, сообщающее пользователю, что ввод не был каталогом.

1 Ответ

0 голосов
/ 30 ноября 2018

Я не вижу необходимости в 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_())
...