如何在 python 中停止空格键弹出 qcombobox

How to stop spacebar popup qcombobox in python

默认情况下 qcombobox 执行内联自动完成,这工作正常 但是当项目包含 space 时 spacebar 按键弹出 qcombobox 我怎样才能禁用它并让 space 键在内联自动完成中使用 我已经尝试使用完整的代码

self.ui.comboBox_ui_3.setEditable(True)
self.ui.comboBox_ui_3.completer().setCompletionMode(QCompleter.InlineCompletion)
self.ui.comboBox_ui_3.setInsertPolicy(QComboBox.NoInsert)

但这没有按预期执行,因为它允许用户在不在您的列表中的可编辑行中输入字母

当按下空格键时,调用QComboBox的keyPressEvent,如果它不可编辑,它会自动显示弹出窗口(F4Alt+↓)。如果按下另一个键并且该键不用于“键盘导航”,例如箭头键,则激活键盘搜索(not“自动完成”,这是完全不同的事情) .

键盘搜索使用了弹窗的keyboardSearch()功能,所以解决办法是实现类似的方法。

这可以通过子类实现:

class MyCombo(QtWidgets.QComboBox):
    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Space:
            # get the QModelIndex of the underlying model
            currentModelIndex = self.model().index(
                self.currentIndex(), self.modelColumn(), self.rootModelIndex())
            # get the popup view, which uses the same model
            view = self.view()
            # set the model index on the view
            view.setCurrentIndex(currentModelIndex)
            # call the keyboard search with the space character
            view.keyboardSearch(' ')
        else:
            # use the default implementation if any other key is pressed
            super().keyPressEvent(event)

由于您可能正在使用由设计器生成的 UI,最简单的解决方案是在组合上安装事件过滤器。实现方式差不多。

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        # ...
        self.ui.comboBox_ui_3.installEventFilter(self)

    def eventFilter(self, source, event):
        if source == self.ui.comboBox_ui_3 and event.type() == event.KeyPress:
            if event.key() == QtCore.Qt.Key_Space:
                currentModelIndex = source.model().index(
                    source.currentIndex(), source.modelColumn(), source.rootModelIndex())
                view = source.view()
                view.setCurrentIndex(currentModelIndex)
                view.keyboardSearch(' ')
                return True
        return super().eventFilter(source, event)