def __init__(self, app, window, lib_tree): QObject.__init__(self) self.app = app self.lib_tree = lib_tree self.library = app.library self.input = window.search_query_input self.view = window.lib_items self.tree_conditions = [] self.items = [] self.items_incomplete = False self.model = ItemModel(self.app) self.model.setColumnCount(1) self.compl_model = QStandardItemModel() self.compl_model.setColumnCount(1) self.completer = QCompleter(self.compl_model) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setModelSorting(QCompleter.CaseSensitivelySortedModel) self.input.setCompleter(self.completer) self.view.setHeaderHidden(True) self.view.setIndentation(0) self.view.setModel(self.model) self.view.sortByColumn(0, Qt.AscendingOrder) self.view.setDragEnabled(True) self.view.setAcceptDrops(True) self.view.setSelectionMode(QAbstractItemView.ExtendedSelection) self.view.setEditTriggers(QAbstractItemView.NoEditTriggers) selection_model = self.view.selectionModel() selection_model.selectionChanged.connect(self.selection_changed) tree_selection_model = window.lib_tree.selectionModel() tree_selection_model.selectionChanged.connect( self.tree_selection_changed) self.input.editingFinished.connect(self.query_entered) self.input.textChanged.connect(self.query_changed) self.view.doubleClicked.connect(self.double_clicked) self.run_query()
def __init__(self): self._tag_completer = QCompleter() # Sort by descending file count tagnames = [ tag[0] for tag in sorted(get_all_tags(), key=lambda t: -t[1]) ] self._tag_completer.setModel(QStringListModel(tagnames))
def __init__(self, node): super().__init__() self.node = node self.show_help = True self.layout = QGridLayout() self.setLayout(self.layout) self.output_area = QTextEdit() self.output_area.setReadOnly(True) self.output_area.acceptRichText = True self.output_area.document().setMaximumBlockCount(5000) self.layout.addWidget(self.output_area) self.input_area = QLineEdit() self.completer = QCompleter() # noinspection PyUnresolvedReferences self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.input_area.setCompleter(self.completer) self.input_area.setFocus() self.layout.addWidget(self.input_area) self.connect(self.input_area, SIGNAL("returnPressed(void)"), self.execute_user_command)
def __init__(self, parent=None, include_targets=True, include_airbases=True, include_frontlines=True, include_units=True, include_enemy=True, include_friendly=True): super(QFilteredComboBox, self).__init__(parent) self.setFocusPolicy(Qt.StrongFocus) self.setEditable(True) self.completer = QCompleter(self) self.include_targets = include_targets self.include_airbases = include_airbases self.include_frontlines = include_frontlines self.include_units = include_units self.include_enemy = include_enemy self.include_friendly = include_friendly # always show all completions self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.completer.setPopup(self.view()) self.setCompleter(self.completer) self.lineEdit().textEdited.connect(self.pFilterModel.setFilterFixedString) self.completer.activated.connect(self.setTextIfCompleterIsClicked)
def __init__(self, node_set: NodeSet): super().__init__() self.node_set = node_set self.layout = QGridLayout() self.output = QTextEdit() self.output.acceptRichText = True self.input = QLineEdit() self.completer = QCompleter() self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.input.setCompleter(self.completer) self.input.setFocus() self.layout.addWidget(self.output) self.layout.addWidget(self.input) self.setLayout(self.layout) self.connect(self.input, SIGNAL("returnPressed(void)"), self.execute_user_command) self.connect(self.completer, SIGNAL("activated(const QString&)"), self.input.clear, Qt.QueuedConnection) self.current_cli = 'bitcoin-cli'
def __init__(self, parent=None): super(ExtendedComboBox, self).__init__(parent) #self.setFocusPolicy(Qt.StrongFocus) #self.setSizeAdjustPolicy(QComboBox.AdjustToContents) # self.setStyleSheet(''' #QComboBox { min-width: 1px} #QComboBox QAbstractItemView::item { min-width: 200px;}" #''') self.setEditable(True) self.setVisible(True) # add a filter model to filter matching items self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.pFilterModel.setSourceModel(self.model()) # add a completer, which uses the filter model self.completer = QCompleter(self.pFilterModel, self) # always show all (filtered) completions self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) self.setCompleter(self.completer) # connect signals self.lineEdit().textEdited.connect( self.pFilterModel.setFilterFixedString) self.completer.activated.connect(self.on_completer_activated)
def init_ui(self, ui_path=None): if not ui_path: ui_path = "{0}/resource/qDesignerUI.ui".format( os.path.dirname(__file__)) # IF A DB OF ASSETS DOES NOT EXIST CREATE IT if not os.path.isfile("{0}/resource/dbAssets.txt".format( os.path.dirname(__file__))): self.assets_db.update_asset_db() # SETTING UP THE QCOMPLETER FOR FASTER INTERACTIONS db_file = open( "{0}/resource/dbAssets.txt".format(os.path.dirname(__file__)), "r") assets = db_file.readlines() # Cleaning the line stripping out the end line character for i in range(len(assets)): assets[i] = assets[i].rstrip('\n') self.asset_to_path = asset_entity.AssetEntity() self.completer = QCompleter() model = QtGui.QStringListModel() self.completer.setModel(model) model.setStringList(assets) f = QtCore.QFile(ui_path) f.open(QtCore.QFile.ReadOnly) loader = QtUiTools.QUiLoader() self.ui = loader.load(f, parentWidget=self) f.close()
def __init__(self, parent=None): super().__init__(parent) self._recursiveActivated = False self._model = FolderListModel(self) self._completer = QCompleter(self._model, self) self._completer.setCompletionColumn(3) self._lineedit = TabCompletionLineEdit(self._completer, self) self._view = QTreeView(self) self._view.setModel(self._model) self._model.folderChanged.connect(self._lineedit.setText) self._model.setFolder(".") self._view.header().setSectionResizeMode(0, QHeaderView.Interactive) self._view.header().setSectionResizeMode(1, QHeaderView.ResizeToContents) self._view.header().setSectionResizeMode(2, QHeaderView.ResizeToContents) self._view.header().resizeSection(0, 500) self._view.header().setSectionHidden(3, True) layout = QVBoxLayout(self) layout.addWidget(self._lineedit) layout.addWidget(self._view) self.setLayout(layout) self._view.activated.connect(self._activated) self.activated.connect(self._lineedit.setText) self._lineedit.returnPressed.connect(self._leActivated, Qt.QueuedConnection) self._lineedit.textEdited.connect(self._leTextEdited)
def on_search_suggestions(self): logging.info('Received search suggestions for keywords: "{}"'.format( self.keywords)) self.searchbar.setEnabled(True) self.searchbar.setFocus() if self.suggestions: suggestions = [ suggestion['label'] for suggestion in self.suggestions ] completer = QCompleter(suggestions) completer.setCaseSensitivity(Qt.CaseInsensitive) self.searchbar.setCompleter(completer) self.searchbar.completer().complete() self.searchbar.completer().popup().setStyleSheet( css( """ QListView { border: 1px solid {{borderColor}}; padding: 10px; background: {{backgroundColor}}; } QItemSelection { padding: 10px; } """, borderColor=colors.SECONDARY_COLOR, backgroundColor=colors.PLACEHOLDER_COLOR, ))
def __init__(self): WizardPage.__init__(self) self.fetch_config = None self.app_model = QStringListModel( REGISTRY.names( lambda klass: not getattr(klass, "disable_in_gui", None))) self.ui.app_combo.setModel(self.app_model) if mozinfo.bits == 64: if mozinfo.os == "mac": self.bits_model = QStringListModel(["64"]) bits_index = 0 else: self.bits_model = QStringListModel(["32", "64"]) bits_index = 1 elif mozinfo.bits == 32: self.bits_model = QStringListModel(["32"]) bits_index = 0 self.ui.bits_combo.setModel(self.bits_model) self.ui.bits_combo.setCurrentIndex(bits_index) self.build_type_model = QStringListModel() self.ui.app_combo.currentIndexChanged.connect(self._set_fetch_config) self.ui.bits_combo.currentIndexChanged.connect(self._set_fetch_config) self.ui.app_combo.setCurrentIndex( self.ui.app_combo.findText("firefox")) self.ui.repository.textChanged.connect(self._on_repo_changed) completer = QCompleter(sorted(get_branches()), self) completer.setCaseSensitivity(Qt.CaseInsensitive) self.ui.repository.setCompleter(completer) QApplication.instance().focusChanged.connect(self._on_focus_changed)
class StringFilterWidget(AbstractFilterWidget): def __init__(self, field: str, parent=None): super().__init__(parent) self.field = field vlayout = QVBoxLayout() vlayout.setContentsMargins(0, 0, 0, 0) self.edit = QLineEdit() vlayout.addWidget(self.edit) self.setLayout(vlayout) self.completer = QCompleter() self.completer_model = QStringListModel() self.completer.setModel(self.completer_model) self.edit.setCompleter(self.completer) self.edit.textChanged.connect(self.changed) def setup(self, conn: sqlite3.Connection): self.completer_model.setStringList( sql.get_field_unique_values(conn, self.field)) def get_filters(self): name = self.field value = self.edit.text() if not value: return "" else: return {"field": name, "operator": "~", "value": value}
def __init__(self, title: str, program: str, args: List[str], commands: List[str]): super().__init__() self.setWindowTitle(title) self.program = program self.args = args self.layout = QGridLayout() self.output = QTextEdit() self.output.acceptRichText = True self.input = QLineEdit() self.completer = QCompleter(commands, self) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.input.setCompleter(self.completer) self.input.setFocus() self.layout.addWidget(self.output) self.layout.addWidget(self.input) self.setLayout(self.layout) self.connect(self.input, SIGNAL("returnPressed(void)"), self.execute_user_command) self.connect(self.completer, SIGNAL("activated(const QString&)"), self.input.clear, Qt.QueuedConnection)
def __init__(self, table_name="", update_field="", database=None, parent=None): super(ExtendedComboBox, self).__init__(parent) self.__type = Types.TEXT self.setMinimumHeight(30) self.setFocusPolicy(Qt.StrongFocus) self.setEditable(True) self._table_name = table_name self._update_field = update_field self._database = database # add a filter model to filter matching items self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.pFilterModel.setSourceModel(self.model()) # add a completer, which uses the filter model self.completer = QCompleter(self.pFilterModel, self) # always show all (filtered) completions self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) self.setCompleter(self.completer) # connect signals self.lineEdit().textEdited.connect(self.pFilterModel.setFilterFixedString) self.completer.activated.connect(self.on_completer_activated)
def __init__(self): super(HelpWidget, self).__init__() # TODO: ovo treba da bude kao neki widget u koji moze da se unese instrukcija ili registar ili direktiva # TODO: pa mu se onda ispise neki uredjeni HTML kao onaj tekst iz praktikuma sta ta kljucna rec znaci # TODO: mozda da se ispisu i neki odabrani algoritmi npr. sabiranje u dvostrukoj preciznosti sa ilustracijama # TODO: ili iteriranje kroz niz self.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.setMinimumWidth(200) self.setStyleSheet("background-color: #2D2D30; color: white;") self.searchLabel = QLineEdit() self.searchLabel.setPlaceholderText("Search for an instruction...") self.completer = QCompleter(list(InstructionsInfo.INFO.keys()), self) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.popup().setStyleSheet( "background-color: #2D2D30; color: white") self.searchLabel.setCompleter(self.completer) self.searchLabel.setStyleSheet( "margin-bottom: 10px; margin-top: 10px;") self.setTitleBarWidget(self.searchLabel) self.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetClosable) self.setWindowTitle("Instructions help") self.resultBox = QTextEdit() self.resultBox.setReadOnly(True) self.setWidget(self.resultBox)
def __init__(self, parent=None): QWidget.__init__(self, parent) self.completer = None self.p_selected_id = 0 self.layout = QHBoxLayout() self.layout.setMargin(0) self.name = QLineEdit() self.name.setText("") self.layout.addWidget(self.name) self.details = QLabel() self.details.setText("") self.details.setVisible(False) self.layout.addWidget(self.details) self.button = QPushButton("...") self.button.setFixedWidth(self.button.fontMetrics().width("XXXX")) self.layout.addWidget(self.button) self.setLayout(self.layout) self.setFocusProxy(self.name) self.button.clicked.connect(self.on_button_clicked) if self.details_field: self.name.setFixedWidth(self.name.fontMetrics().width("X") * 15) self.details.setVisible(True) self.completer = QCompleter(self.dialog.model.completion_model) self.completer.setCompletionColumn( self.dialog.model.completion_model.fieldIndex(self.selector_field)) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.name.setCompleter(self.completer) self.completer.activated[QModelIndex].connect(self.on_completion)
def __setUpInputOutputLayout(self) -> QFormLayout: # Add input and output boxes self._inputComboBox = QComboBox(self.editor) self._inputComboBox.setModel(self.operation.workbench) self._outputNameBox = TextOptionWidget(parent=self.editor) self._outputNameBox.widget.textChanged.connect( self._validateOutputName) self._inputComboBox.currentTextChanged.connect(self._changeInputFrame) ioLayout = QFormLayout() ioLayout.addRow('Input data:', self._inputComboBox) ioLayout.addRow('Output name:', self._outputNameBox) completer = QCompleter(self._outputNameBox) completer.setModel(self.operation.workbench) completer.setFilterMode(Qt.MatchContains) completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel) completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) self._outputNameBox.widget.setCompleter(completer) if self.selectedFrame: if self.selectedFrame == self._inputComboBox.currentText(): # Manually trigger the slot to change input self._changeInputFrame(self.selectedFrame) else: # Set the frame (will trigger _changeInputFrame) self._inputComboBox.setCurrentText(self.selectedFrame) else: # Default to whatever input name is set self._changeInputFrame(self._inputComboBox.currentText()) return ioLayout
def __init__(self, parent=None): super(AdvComboBox, self).__init__(parent) self.setFocusPolicy(QtCore.Qt.StrongFocus) self.setEditable(True) # add a filter model to filter matching items self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) self.pFilterModel.setSourceModel(self.model()) # add a completer, which uses the filter model self.completer = QCompleter(self.pFilterModel, self) # always show all (filtered) completions self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) self.setCompleter(self.completer) # connect signals def filter_function(text): self.pFilterModel.setFilterFixedString(str(text)) self.lineEdit().textEdited.connect(filter_function) self.completer.activated.connect(self.on_completer_activated)
def init_completer(self, words: Iterable[str]) -> None: assert self.completer is None self.completer = QCompleter(list(words), self) self.completer.setWidget(self) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.activated.connect(self.on_insert_completion)
def __init__(self, parent=None): QLineEdit.__init__(self, parent) self.fsmodel = QFileSystemModel() self.fsmodel.setRootPath("") self.completer = QCompleter() self.completer.setModel(self.fsmodel) self.setCompleter(self.completer) self.fsmodel.setFilter(QDir.Drives | QDir.AllDirs | QDir.Hidden | QDir.NoDotAndDotDot)
class QFilteredComboBox(QComboBox): def __init__( self, parent=None, include_targets=True, include_airbases=True, include_frontlines=True, include_units=True, include_enemy=True, include_friendly=True, ): super(QFilteredComboBox, self).__init__(parent) self.setFocusPolicy(Qt.StrongFocus) self.setEditable(True) self.completer = QCompleter(self) self.include_targets = include_targets self.include_airbases = include_airbases self.include_frontlines = include_frontlines self.include_units = include_units self.include_enemy = include_enemy self.include_friendly = include_friendly # always show all completions self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.completer.setPopup(self.view()) self.setCompleter(self.completer) self.lineEdit().textEdited.connect(self.pFilterModel.setFilterFixedString) self.completer.activated.connect(self.setTextIfCompleterIsClicked) def setModel(self, model): super(QFilteredComboBox, self).setModel(model) self.pFilterModel.setSourceModel(model) self.completer.setModel(self.pFilterModel) self.model().sort(0) def setModelColumn(self, column): self.completer.setCompletionColumn(column) self.pFilterModel.setFilterKeyColumn(column) super(QFilteredComboBox, 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)
def init_db(self, table, selector_field, details_field=None): self.table = table self.selector_field = selector_field if details_field: self.name.setFixedWidth(self.name.fontMetrics().width("X") * 15) self.details_field = details_field self.details.setVisible(True) self.completer = QCompleter(self.dialog.Model) self.completer.setCompletionColumn( self.dialog.Model.fieldIndex(self.selector_field)) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.name.setCompleter(self.completer) self.completer.activated[QModelIndex].connect(self.on_completion)
def create_widgets(self): self.label_player1 = QLabel("Player 1") self.input_player1_name = QLineEdit() self.input_player1_name.setPlaceholderText("Player 1") self.input_player1_name.setFocus() self.player1_completer = QCompleter() self.input_player1_name.setCompleter(self.player1_completer) self.label_player2 = QLabel("Player 2") self.input_player2_name = QLineEdit() self.input_player2_name.setPlaceholderText("Player 2") self.player2_completer = QCompleter() self.input_player2_name.setCompleter(self.player2_completer) # player widget-ek feltültése a db-ben szereplő nevekkel, autocomplete-hez self.get_player_name() self.gomb_301 = QRadioButton("301") self.gomb_401 = QRadioButton("401") self.gomb_501 = QRadioButton("501") self.gomb_501.setChecked(True) self.gomb_701 = QRadioButton("701") self.label_bestof = QLabel("Best Of.. (Egyébként First To..)") self.best_of = QCheckBox() self.spin_legs = QSpinBox() self.spin_legs.setValue(3) self.spin_legs.setMinimum(1) self.spin_legs.setMaximum(21) self.spin_sets = QSpinBox() self.spin_sets.setValue(1) self.spin_sets.setMinimum(1) self.spin_sets.setMaximum(15) self.handi1 = QSpinBox() self.handi1.setValue(0) self.handi1.setMinimum(-100) self.handi1.setMaximum(100) self.handi2 = QSpinBox() self.handi2.setValue(0) self.handi2.setMinimum(-100) self.handi2.setMaximum(100) self.buttonbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel | QDialogButtonBox.Reset) self.buttonbox.clicked.connect(self.buttonbox_click)
class GlobalState(object): """Stores all global state not handled by Qt.""" # TODO: Refactor settings into here def __init__(self): self._tag_completer = QCompleter() # Sort by descending file count tagnames = [ tag[0] for tag in sorted(get_all_tags(), key=lambda t: -t[1]) ] self._tag_completer.setModel(QStringListModel(tagnames)) @property def tag_completer(self) -> QCompleter: """A dropdown completer used for any tag entry widget.""" return self._tag_completer
def _completerSetupFunction(self, editor, index): completer = QCompleter(getHeadersData(), editor) completer.setCompletionColumn(0) completer.setCompletionRole(Qt.EditRole) completer.setCaseSensitivity(Qt.CaseInsensitive) try: editor.setCompleter(completer) except: pass
class FSLineEdit(QLineEdit): """ A line edit with auto completion for file system folders. """ def __init__(self, parent=None): QLineEdit.__init__(self, parent) self.fsmodel = QFileSystemModel() self.fsmodel.setRootPath("") self.completer = QCompleter() self.completer.setModel(self.fsmodel) self.setCompleter(self.completer) self.fsmodel.setFilter(QDir.Drives | QDir.AllDirs | QDir.Hidden | QDir.NoDotAndDotDot) def setPath(self, path): self.setText(path) self.fsmodel.setRootPath(path)
def __init__(self, field: str, parent=None): super().__init__(parent) self.field = field vlayout = QVBoxLayout() vlayout.setContentsMargins(0, 0, 0, 0) self.edit = QLineEdit() vlayout.addWidget(self.edit) self.setLayout(vlayout) self.completer = QCompleter() self.completer_model = QStringListModel() self.completer.setModel(self.completer_model) self.edit.setCompleter(self.completer) self.edit.textChanged.connect(self.changed)
def __init__(self, root_path) -> None: QWidget.__init__(self) # self.index stores the index of the latest item which is clicked # self.root_path is the path to the folder currently showing self.index = None self.root_path = os.path.abspath(root_path) self.dir_view = QTreeView() self.model = QFileSystemModel(self.dir_view) self.model.setRootPath(self.root_path) self.dir_view.clicked.connect(self.onFileItemClicked) self.dir_view.doubleClicked.connect(self.onFileItemDoubleClicked) self.dir_view.setModel(self.model) self.dir_view.setRootIndex(self.model.index(self.root_path)) open_button = QPushButton("Open") open_button.clicked.connect(self.openFile) open_in_file_explorer_button = QPushButton("Open in File Explorer") open_in_file_explorer_button.clicked.connect(self.openInFileExplorer) self.root_path_line_edit = QLineEdit(self.root_path) self.root_path_line_edit.returnPressed.connect( self.onChangeLineEditReturned) self.root_path_line_edit.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.root_path_line_edit.adjustSize() change_path_button = QPushButton('Change Directory') change_path_button.clicked.connect(self.onChangeButtonClicked) addressCompleter = QCompleter() addressCompleter.setModel(self.model) self.root_path_line_edit.setCompleter(addressCompleter) # Set layout layout = QGridLayout() layout.addWidget(self.root_path_line_edit, 0, 0, 1, 1) layout.addWidget(change_path_button, 0, 1, 1, 1) layout.addWidget(self.dir_view, 1, 0, 1, 2) layout.addWidget(open_button, 2, 0, 1, 1) layout.addWidget(open_in_file_explorer_button, 2, 1, 1, 1) layout.setMargin(0) self.setLayout(layout)
def init_ui(self): self.ui.card_search_completer = QCompleter(self.card_catalog.names_list_unique, self) self.ui.card_search_completer.setCaseSensitivity(Qt.CaseInsensitive) self.ui.search_entry.setCompleter(self.ui.card_search_completer) self.ui.search_entry.returnPressed.connect(self.search_for_card) self.ui.search_button.clicked.connect(self.search_for_card) self.ui.add_card_button.clicked.connect(self._show_selected) self.ui.results_tree.setSelectionBehavior(QAbstractItemView.SelectRows)
def __init__(self, lookup_names: List[str], on_entered: CallbackType) -> None: widget = QLineEdit("") completer = QCompleter(lookup_names) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setFilterMode(Qt.MatchFlag.MatchContains) completer.setMaxVisibleItems(50) widget.setCompleter(completer) super().__init__("Название рецепта:", widget) self._on_recipe_name_entered = on_entered self._connect_slots()
def __init__(self, parent): super(self.__class__, self).__init__() self.model = QStringListModel() self.setCompleter(QCompleter()) self.completer().setModel(self.model) self.completer().setCompletionMode(QCompleter.PopupCompletion) self.completer().activated.connect(self.selected) self.textEdited.connect(self.slot_text_edited) self.parent = parent self.setPlaceholderText("Type tags here")