如何在 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
,如果它不可编辑,它会自动显示弹出窗口(F4和Alt+↓)。如果按下另一个键并且该键不用于“键盘导航”,例如箭头键,则激活键盘搜索(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)
默认情况下 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
,如果它不可编辑,它会自动显示弹出窗口(F4和Alt+↓)。如果按下另一个键并且该键不用于“键盘导航”,例如箭头键,则激活键盘搜索(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)