【问题标题】:Autocomplete from start of (one of) multiple columns从(之一)多列的开始自动完成
【发布时间】:2019-11-20 09:16:05
【问题描述】:

我有包含多列的数据(如“名字”/“姓氏”或“邮政编码”/“地名”),我现在想要(类似于)一个仅从一开始就匹配的 qcompleter每一列。

这意味着输入“a”会显示“Andrea Miller”或“John Adams”等建议,但不会显示“Jane Doe”或“Tom Masters”。

任何提示如何实现这个?

【问题讨论】:

标签: python autocomplete pyside2 qlineedit qcompleter


【解决方案1】:

解决方法是禁用 QCompleter 过滤并使用 QSortFilterProxyModel 进行自定义过滤:

import sys


from PySide2 import QtCore, QtWidgets


class FilterModel(QtCore.QSortFilterProxyModel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self._prefix = ""

    @property
    def prefix(self):
        return self._prefix

    @prefix.setter
    def prefix(self, prefix):
        self._prefix = prefix.lower()
        self.invalidateFilter()

    def filterAcceptsRow(self, sourceRow, sourceParent):
        if not self.prefix:
            return True
        text = (
            self.sourceModel()
            .index(sourceRow, self.filterKeyColumn(), sourceParent)
            .data()
        )
        for word in text.split():
            if word.lower().startswith(self.prefix):
                return True
        return False


class Completer(QtWidgets.QCompleter):
    def setModel(self, model):
        proxy_internal_model = FilterModel(self)
        proxy_internal_model.setSourceModel(model)
        model.setParent(proxy_internal_model)
        super().setModel(proxy_internal_model)

    def splitPath(self, path):
        if isinstance(self.model(), FilterModel):
            self.model().prefix = path
        return [""]


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QLineEdit()
    texts = ["Andrea Miller", "John Adams", "Jane Doe", "Tom Masters"]
    completer = Completer(w)
    completer.setModel(QtCore.QStringListModel(texts, w))
    w.setCompleter(completer)
    w.show()
    sys.exit(app.exec_())

【讨论】:

    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2020-11-10
    相关资源
    最近更新 更多