我正在使用 Qt4.6,并且我有一个带有 QCompleter 的 QComboBox。
通常的功能是根据前缀提供完成提示(这些提示可以在下拉列表中而不是内联 - 这是我的用法)。例如,给定
chicken soup
chilli peppers
grilled chicken
输入 ch
将匹配 chicken soup
和 chilli peppers
但不是 grilled chicken
。
我想要的是能够输入 ch
并匹配所有这些,或者更具体地说,chicken
并匹配 chicken soup
和烤鸡
。
我还希望能够将 chs
之类的标签分配给 chicken soup
以生成另一个匹配项,而不仅仅是文本内容。我可以处理算法,但是,
我需要覆盖 QCompleter 的哪些功能?
我不太确定我应该看哪里...
最佳答案
根据@j3frea 的建议,这是一个工作示例(使用 PySide
)。似乎每次调用 splitPath
时都需要设置模型(在 setModel
中设置一次代理不起作用)。
combobox.setEditable(True)
combobox.setInsertPolicy(QComboBox.NoInsert)
class CustomQCompleter(QCompleter):
def __init__(self, parent=None):
super(CustomQCompleter, self).__init__(parent)
self.local_completion_prefix = ""
self.source_model = None
def setModel(self, model):
self.source_model = model
super(CustomQCompleter, self).setModel(self.source_model)
def updateModel(self):
local_completion_prefix = self.local_completion_prefix
class InnerProxyModel(QSortFilterProxyModel):
def filterAcceptsRow(self, sourceRow, sourceParent):
index0 = self.sourceModel().index(sourceRow, 0, sourceParent)
return local_completion_prefix.lower() in self.sourceModel().data(index0).lower()
proxy_model = InnerProxyModel()
proxy_model.setSourceModel(self.source_model)
super(CustomQCompleter, self).setModel(proxy_model)
def splitPath(self, path):
self.local_completion_prefix = path
self.updateModel()
return ""
completer = CustomQCompleter(combobox)
completer.setCompletionMode(QCompleter.PopupCompletion)
completer.setModel(combobox.model())
combobox.setCompleter(completer)
关于qt - QCompleter 自定义完成规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33808597/