我在这里找到了一个很好的资源来构建一个 QComboBox,它提供了一个过滤的建议列表。除了每次我在组合框中选择建议的选项时,“activated”和“currentIndexChanged”信号会发出三次之外,它运行良好。行为会有所不同,具体取决于是通过鼠标还是使用箭头键和 Enter 按钮选择了该选项。
我的问题是,我该如何调试?代码中没有必要捕获和阻止前两个信号发出。有没有办法覆盖 QComboBox “激活”信号以尝试在行为中捕获它?还是我必须定义自己的信号并使用它?
这是代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import Qt, QSortFilterProxyModel
from PySide2.QtWidgets import QCompleter, QComboBox
class ExtendedComboBox(QComboBox):
def __init__(self, parent=None):
super(ExtendedComboBox, self).__init__(parent)
self.setFocusPolicy(Qt.StrongFocus)
self.setEditable(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 = QtWidgets.QCompleter(self)
self.completer.setModel(self.pFilterModel)
# 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)
# on selection of an item from the completer, select the corresponding item from combobox
def on_completer_activated(self, text):
if text:
index = self.findText(text)
self.setCurrentIndex(index)
# self.activated.emit(self.itemText(index))
您会注意到,如果您运行代码并开始在文本框中输入“hello”,然后单击建议的“hello world”,activated信号会返回正确的“hello world”。如果你开始输入“hello”,但这次使用箭头键向下滚动到“hello world”,它会发出 3 次。
我已经尝试过多次实现同样的想法,结果都一样。在用新模型替换模型后,我什至注意到未修改的 QComboBox 的类似行为。
PySide2 5.6.0a1 Windows 10.0.18362 内部版本 18362
谢谢参观!
隔江千里
人到中年有点甜
相关分类