【问题标题】:How to stop spacebar popup qcombobox in python如何在python中停止空格键弹出qcombobox
【发布时间】:2021-01-27 23:34:38
【问题描述】:

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

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

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

【问题讨论】:

  • 您所说的“内联自动完成”是指根据键入的内容选择项目的键盘搜索,即使组合不可可编辑?
  • 是的,完全正确,但只是点击一个空格它不再自动完成并且它会弹出

标签: python pyqt5 qcombobox


【解决方案1】:

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

键盘搜索使用了弹窗的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)

【讨论】:

  • 看起来与 ui 一起工作我认为因为它不再使用空格键弹出,但是一旦我点击空格,它会在点击空格键后搜索以字母开头的单词
  • 可能是搜索超时?
  • @HoussamFarag 抱歉,我不明白你的意思,你能说清楚点吗?
  • 我正在寻找像炸鸡这样的项目,一旦我输入 Fried 并点击空格,它就会开始获取以 c(鸡中的第一个字母)开头的项目,我认为这与打字速度有关吗?跨度>
  • @HoussamFarag 键盘搜索使用当前 之后的第一个完全匹配,并且空格字符与任何其他字符完全相同。如果您的项目是["a", "ax"] 并且"a" 是当前项目,如果您随后按“a”,它将选择第二个。空格键也是如此:如果您的项目中有“炸”和“炸鸡”,当您在键入“炸”后按空格键时,它显然会返回以“炸”开头的第一个匹配项(带空格) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多