QSortFilterProxyModel:允许新项目

2024-10-03 00:17:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现一个具有自动完成和过滤功能的QCombobox。我找到了QSortFilterProxyModel的示例,但是它的行为与我的不同:我无法添加新字符串来创建新项(如果它不在列表中)

你有什么建议吗?我应该实现自定义ProxyModel,还是不可能实现

MWE(我还想在显示窗口时添加一个默认值“”:

from PyQt5.QtWidgets import QComboBox, QMainWindow
from PyQt5 import QtCore, QtWidgets
import sys


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setFixedWidth(400)

        self.cB_opc_type = QComboBox(self)
        self.cB_opc_type.setEditable(True)
        self.cB_opc_type.setFixedHeight(60)
        self.cB_opc_type.setFixedWidth(300)

        self.lst = ["Abcd", "Abka", "Dezea", "Bddqdq", "Excqq"]
        self.lst.sort()
        self.qlst = QtCore.QStringListModel()
        self.qlst.setStringList(self.lst)

        self.ProxyModel = QtCore.QSortFilterProxyModel()
        self.ProxyModel.setSourceModel(self.qlst)
        self.ProxyModel.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.ProxyModel.setDynamicSortFilter(True)
        self.ProxyModel.setSortRole(QtCore.Qt.EditRole)
        self.cB_opc_type.setModel(self.ProxyModel)

        self.completer = QtWidgets.QCompleter(self.ProxyModel, self)
        self.completer.setCompletionMode(QtWidgets.QCompleter.UnfilteredPopupCompletion)
        self.cB_opc_type.setCompleter(self.completer)

        self.cB_opc_type.editTextChanged.connect(self.maj_items)

    def maj_items(self, etc):
        self.ProxyModel.setFilterFixedString(etc)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    window = Window()
    window.show()
    sys.exit(app.exec())


Tags: fromimportselftypesyspyqt5cblst