class ValidatingLineEdit(LineEdit): statusChanged = pyqtSignal() def __init__(self, parent=None): super(ValidatingLineEdit, self).__init__(parent) self.invalid_entry_label = QLabel(self) self.invalid_entry_label.setFixedSize(18, 16) self.invalid_entry_label.setPixmap( QPixmap(Resources.get('icons/invalid16.png'))) self.invalid_entry_label.setScaledContents(False) self.invalid_entry_label.setAlignment(Qt.AlignCenter) self.invalid_entry_label.setObjectName('invalid_entry_label') self.invalid_entry_label.hide() self.addTailWidget(self.invalid_entry_label) option = QStyleOptionFrameV2() self.initStyleOption(option) frame_width = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth, option, self) self.setMinimumHeight(self.invalid_entry_label.minimumHeight() + 2 + 2 * frame_width) self.textChanged.connect(self._SH_TextChanged) self.text_correct = True self.text_allowed = True self.exceptions = set() self.regexp = re.compile(r'.*') def _get_regexp(self): return self.__dict__['regexp'] def _set_regexp(self, regexp): self.__dict__['regexp'] = regexp self._validate() regexp = property(_get_regexp, _set_regexp) del _get_regexp, _set_regexp @property def text_valid(self): return self.text_correct and self.text_allowed def _SH_TextChanged(self, text): self._validate() def _validate(self): text = self.text() text_correct = self.regexp.search(text) is not None text_allowed = text not in self.exceptions if self.text_correct != text_correct or self.text_allowed != text_allowed: self.text_correct = text_correct self.text_allowed = text_allowed self.invalid_entry_label.setVisible(not self.text_valid) self.statusChanged.emit() def addException(self, exception): self.exceptions.add(exception) self._validate() def removeException(self, exception): self.exceptions.remove(exception) self._validate()
class ValidatingLineEdit(LineEdit): statusChanged = pyqtSignal() def __init__(self, parent=None): super(ValidatingLineEdit, self).__init__(parent) self.invalid_entry_label = QLabel(self) self.invalid_entry_label.setFixedSize(18, 16) self.invalid_entry_label.setPixmap(QPixmap(Resources.get('icons/invalid16.png'))) self.invalid_entry_label.setScaledContents(False) self.invalid_entry_label.setAlignment(Qt.AlignCenter) self.invalid_entry_label.setObjectName('invalid_entry_label') self.invalid_entry_label.hide() self.addTailWidget(self.invalid_entry_label) option = QStyleOptionFrameV2() self.initStyleOption(option) frame_width = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth, option, self) self.setMinimumHeight(self.invalid_entry_label.minimumHeight() + 2 + 2*frame_width) self.textChanged.connect(self._SH_TextChanged) self.text_correct = True self.text_allowed = True self.exceptions = set() self.regexp = re.compile(r'.*') def _get_regexp(self): return self.__dict__['regexp'] def _set_regexp(self, regexp): self.__dict__['regexp'] = regexp self._validate() regexp = property(_get_regexp, _set_regexp) del _get_regexp, _set_regexp @property def text_valid(self): return self.text_correct and self.text_allowed def _SH_TextChanged(self, text): self._validate() def _validate(self): text = self.text() text_correct = self.regexp.search(text) is not None text_allowed = text not in self.exceptions if self.text_correct != text_correct or self.text_allowed != text_allowed: self.text_correct = text_correct self.text_allowed = text_allowed self.invalid_entry_label.setVisible(not self.text_valid) self.statusChanged.emit() def addException(self, exception): self.exceptions.add(exception) self._validate() def removeException(self, exception): self.exceptions.remove(exception) self._validate()