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