qt - QCompleter 自定义完成规则

标签 qt qt4 qt4.6 qcombobox qcompleter

我正在使用 Qt4.6,并且我有一个带有 QCompleter 的 QComboBox。

通常的功能是根据前缀提供完成提示(这些提示可以在下拉列表中而不是内联 - 这是我的用法)。例如,给定

chicken soup
chilli peppers
grilled chicken

输入 ch 将匹配 chicken soupchilli 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/

相关文章:

c++ - 当用户尝试激活 MainWindow 时引发模态 QDialog

c++ - 尝试调用 registerSource 时找不到 .rcc 文件

qt - 如何在 qml 中旋转 3d 立方体?

c++ - QTextEdit 没有设置文本

c++ - Qt Sqlite 表列似乎不见了

qt - 如何在 QT OpenGL Widget 上使用 OpenGL 函数?

excel - 如何从 Excel 中获取单元格超链接地址?

c++ - Qt与OpenCV的高效整合

c++ - 如何将 X11 事件传递给 QDialog

qt4 - 使用 Qt 4.6 钩住键盘上的键和组合键