Проверьте, является ли редактируемый ввод QCombobox каталогом через QValidator

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)

к сожалению, это не работает должным образом, потому что каждый вход по-прежнему добавляется в combobox, когда я нажимаю enter. Какие-либо предложения?

EDIT: я также попытался использовать валидатор на QLineEdit следующим образом:

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

Не работает.

EDIT: Это работает... но когда я нажимаю "hasFocus", все равно True, поэтому он просто принимает вход и затем, конечно, добавляет его в combobox. если я избавлюсь от "if self._input.hasFocus():" он не принимает никакого ввода, если я его ввешу... просто, если вставить полный путь к каталогу. Поэтому мне нужен способ проверить, закончено ли редактирование, и проверить, является ли это каталогом. И насколько я понимаю, я могу проверить это только в combobox через QValidator... потому что он сразу добавляет вход в поле... прежде чем я могу каким-либо образом перехватить его.

EDIT: я нашел решение для своего дела. Я просто отказался от всего подхода валидатора. Цель этого была в том, чтобы запретить combobox создавать новый элемент, если он не был действительным каталогом... то, что я теперь сделал, вместо этого состоял в том, чтобы проверить ввод после его завершения, воспользовавшись QLineEdit(). EditFinished() signal, После создания нового элемента я просто удалил его снова, если вход был недействителен, и он также дал мне возможность добавить всплывающее сообщение о том, что вход не был каталогом.

  • 0
    Я думаю, что hasFocus () не является необходимым, почему вы думаете, что это необходимо?
  • 0
    вы очень правы, это не нужно ... я просто не знал ничего лучше, так как я не знал значение промежуточного
Теги:
pyside
qcombobox
qdir
qvalidator

1 ответ

0
Лучший ответ

Я не вижу необходимости 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_())
  • 0
    Вы сделали это ... теперь я знаю, как правильно использовать Intermediate. Ты очень понравился!
  • 0
    единственное, что меня до сих пор как-то беспокоит, так это то, что он проверяет filedir каждый раз, когда я набираю букву ... это, конечно, не идеально ... но пока я не вижу лучшего решения;)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню