Проверить, является ли редактируемый ввод QCombobox каталогом через 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)

Тоже не работает.

РЕДАКТИРОВАТЬ: это вроде как работает... но когда я нажимаю return, "hasFocus" по-прежнему имеет значение True, поэтому он просто принимает ввод, а затем, конечно, добавляет его в поле со списком. если я избавлюсь от «if self._input.hasFocus():», он не примет никаких входных данных, если я его наберу... просто если вставить полный путь к каталогу. Итак, мне нужен способ проверить, завершено ли редактирование, а затем проверить, является ли это каталогом. И насколько я понимаю, я могу проверить это только в поле со списком через QValidator... потому что он сразу добавляет ввод в поле... до того, как я смогу его перехватить каким-либо образом.

РЕДАКТИРОВАТЬ: я нашел решение для своего случая. Я просто отказался от всего подхода к валидации. Цель этого заключалась в том, чтобы предотвратить создание нового элемента в поле со списком, если он не был допустимым каталогом... вместо этого я сделал проверку ввода после его завершения, воспользовавшись сигналом QLineEdit().editingFinished() . После того, как он создал новый элемент, я просто удалил его снова, если ввод был недействительным, и это также дало мне возможность добавить всплывающее окно с ошибкой, сообщающее пользователю, что ввод не является каталогом.


person zwusel    schedule 30.11.2018    source источник
comment
Я думаю, что hasFocus() не нужен, почему вы думаете, что это необходимо?   -  person eyllanesc    schedule 30.11.2018
comment
вы очень правы, в этом нет необходимости... я просто не знал ничего лучше, так как не знал значение промежуточного   -  person zwusel    schedule 02.12.2018


Ответы (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_())
person eyllanesc    schedule 30.11.2018
comment
Вы сделали это... теперь я знаю, как правильно использовать Intermediate. Тай очень! - person zwusel; 30.11.2018
comment
единственное, что меня все еще как-то беспокоит в этом решении, это то, что оно проверяет filedir каждый раз, когда я набираю букву... это, конечно, не идеально... но пока я не вижу лучшего решения;) - person zwusel; 30.11.2018
comment
@zwusel Почему это не идеально?, Всякий раз, когда вы что-то указываете, аргументируйте это, для меня это правильно, так как могут быть папки с названием из одной, двух, ... букв - person eyllanesc; 30.11.2018
comment
я действительно спорил с этим;) как я уже сказал, я чувствую, что нет необходимости проверять каждую напечатанную букву, но только если редактирование завершено... по крайней мере, для моего приложения. не поймите меня неправильно... это все еще лучшее решение, которое у меня есть на данный момент. ты - person zwusel; 02.12.2018
comment
Кстати, я нашел лучшее решение для моего случая. Я просто отказался от всего подхода к валидации. Цель этого состояла в том, чтобы предотвратить создание нового элемента в поле со списком, если он не был допустимым каталогом... вместо этого я сделал, чтобы проверить ввод после его завершения, и если он недействителен, я просто удалил элемент, а также добавлено всплывающее окно с сообщением о том, что ввод недействителен. Но... и это самое важное... я многое узнал о QValidator... так что действительно многое понял ;) - person zwusel; 02.12.2018