如何在QT 5.6.1中使用QSortFilterProxyModel执行递归过滤器搜索?

问题描述

我正在使用QSortFilterProxyModel,并且正在寻找一种在QtView:QTreeView中的5.6.1中执行递归搜索解决方案。

由于在更高版本的QT中添加了setRecursiveFilteringEnabled,因此我可以使用setRecursiveFilteringEnabled方法

我当前正在使用:

由于无法使用setRecursiveFilteringEnabled,如何过滤整个层次结构?

from pyside2 import QtGui,QtCore,QtWidgets

class MainFrame(QtWidgets.QDialog):
    def __init__(self,parent=None):
        super(MainFrame,self).__init__(parent)

        tree = {
            "Root": {
                "Level1": {
                    "Level1_item1": 14,"Level1_item2": 12,"Level1_item3": 3.55,},"Level2": {
                    "Level2_SubLevel1": {
                        "Level2_SubLevel1_item1": 3.52,"Level2_SubLevel1_item2": 2.55,"Level2_SubLevel1_item3": 13,"Level2_SubLevel2": {
                        "Level2_SubLevel2_item1": 2,"Level2_SubLevel2_item2": 4,"Level2_SubLevel2_item3": 3.11,"Level3": {
                    "Level3_item1": 12,"Level3_item2": 13.55,"Level3_item3": 122,}

        self.tree = QtWidgets.QTreeView()
        self.filterEdit = QtWidgets.QLineEdit()
        self.filterEdit.textChanged.connect(self.onTextChanged)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.filterEdit)
        layout.addWidget(self.tree)

        self.root_model = QtGui.QStandardItemmodel()
        self.root_model.setHorizontalHeaderLabels(["Level","Values"])
        self.fill_model_from_json(self.root_model.invisibleRootItem(),tree)

        self.proxyModel = QtCore.QSortFilterProxyModel(self)
        self.proxyModel.setFilterKeyColumn(0)
        # Following call is not available in QT 5.6.1
        # self.proxyModel.setRecursiveFilteringEnabled(True) 
        
        self.proxyModel.setSourceModel(self.root_model)

        self.tree.setModel(self.proxyModel)
        self.tree.header().setMinimumSectionSize(300)

        self.tree.expandAll()
        self.resize(640,480)

    def onTextChanged(self,text):
        self.proxyModel.setFilterRegExp(text)
        self.tree.expandAll()

    def fill_model_from_json(self,parent,d):
        if isinstance(d,dict):
            for key,value in d.items():
                it = QtGui.QStandardItem(str(key))
                if isinstance(value,dict):
                    parent.appendRow(it)
                    self.fill_model_from_json(it,value)
                else:
                    it2 = QtGui.QStandardItem(str(value))
                    parent.appendRow([it,it2])


d = MainFrame()
d.show()

# if __name__ == "__main__":
#     import sys

#     app = QtWidgets.QApplication(sys.argv)
#     main = MainFrame()
#     main.show()
#     sys.exit(app.exec_())

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)