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