2024-06-01 10:17:58 发布
网友
我有多个列的数据(如“名字”/“姓氏”或“邮政编码”/“地名”),现在我想有一个(如)qcompleter,它只匹配每一列的开头
这意味着输入“a”将显示类似“andrea Miller”或“Johnadams”的建议,而不是“Jane Doe”或“Tom Masters”
如何实现这个有什么提示吗
解决方法是禁用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_())
解决方法是禁用QCompleter筛选并使用QSortFilterProxyModel执行自定义筛选:
相关问题 更多 >
编程相关推荐