class EnumComboBox(QComboBox): changeCallback = QtCore.Signal(str) def __init__(self, values=[], parent=None): super(EnumComboBox, self).__init__(parent) self.setFocusPolicy(QtCore.Qt.StrongFocus) self.setEditable(True) self.completer = QCompleter(self) # always show all completions self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) self.pFilterModel = QtCore.QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) self.setInsertPolicy(self.NoInsert) self.completer.setPopup(self.view()) self.setCompleter(self.completer) self.lineEdit().textEdited[str].connect( self.pFilterModel.setFilterFixedString) self.lineEdit().returnPressed.connect(self.onReturnPressed) self.completer.activated.connect(self.setTextIfCompleterIsClicked) self.model = QtGui.QStandardItemModel() for i, value in enumerate(values): item = QtGui.QStandardItem(value) self.model.setItem(i, 0, item) self.setModel(self.model) self.setModelColumn(0) self.currentIndexChanged.connect(self.onIndexChanged) def onReturnPressed(self): self.changeCallback.emit(self.currentText()) def onIndexChanged(self, index): self.changeCallback.emit(self.currentText()) def setModel(self, model): super(EnumComboBox, self).setModel(model) self.pFilterModel.setSourceModel(model) self.completer.setModel(self.pFilterModel) def setModelColumn(self, column): self.completer.setCompletionColumn(column) self.pFilterModel.setFilterKeyColumn(column) super(EnumComboBox, self).setModelColumn(column) def view(self): return self.completer.popup() def index(self): return self.currentIndex() def setTextIfCompleterIsClicked(self, text): if text: index = self.findText(text) self.setCurrentIndex(index)
class ConsoleInput(QLineEdit, object): def __init__(self, commands=[], parent=None): super(ConsoleInput, self).__init__(parent=parent) self._commands = commands self._model = QStringListModel() self._model.setStringList(self._commands) self._completer = QCompleter(self) self._completer.setModel(self._model) self._completer.setCompletionMode(QCompleter.PopupCompletion) self._completer.setCaseSensitivity(Qt.CaseInsensitive) self.setCompleter(self._completer) self.setFont(QFont('Arial', 9, QFont.Bold, False))