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