def __init__(self, parent, delimiters, entries, entries_updater): super(QDelimitedCompleter, self).__init__(parent) self.delimiters = delimiters if isinstance(parent, QtWidgets.QLineEdit): self.text_getter = parent.text self.cursor_pos = parent.cursorPosition self.insert_text = parent.insert parent.textChanged[str].connect(self.text_changed) self.completionNeeded.connect(self.complete) elif isinstance(parent, QtWidgets.QTextEdit): parent.textChanged.connect(self.text_changed) self.cursor_pos = lambda: parent.textCursor().position() self.insert_text =\ lambda text: parent.textCursor().insertText(text) self.text_getter = parent.toPlainText self.completionNeeded.connect(self._text_edit_complete) else: msg = 'Parent of QtCompleter must QLineEdit or QTextEdit, not {}' raise ValueError(msg.format(parent)) self.setCaseSensitivity(QtCore.Qt.CaseSensitive) self.setModel(QtCore.QStringListModel(entries, self)) self.activated[str].connect(self.complete_text) self.setWidget(parent) self._upddate_entries = True self._popup_active = False self.entries_updater = entries_updater
def text_changed(self, text=None): """Callback handling the text being edited on the parent. """ if not text: text = self.text_getter() if self._upddate_entries and self.entries_updater: entries = self.entries_updater() self.setModel(QtCore.QStringListModel(entries, self)) self._upddate_entries = False all_text = uni(text) text = all_text[:self.cursor_pos()] split = text.split(self.delimiters[0]) prefix = split[-1].strip() if len(split) > 1: self.setCompletionPrefix(prefix) self.completionNeeded.emit() elif self.popup().isVisible(): self.popup().hide()
def _update_entries(self, entries): """Update the completer completion model. """ self.setModel(QtCore.QStringListModel(entries))