如何使用 QSortFilterProxyModel 的 setFilterRegExp() 和 filterAcceptsRow()

How to use QSortFilterProxyModel's setFilterRegExp() along with filterAcceptsRow()

在实现 QSortFilterProxyModel(与 QTableView 一起使用)时,我通过在其中定义一些自定义逻辑(关于如何过滤项目)覆盖了代理的 filterAcceptsRow() 方法。现在似乎覆盖代理的 "default" filterAcceptsRow() 与围绕 .setFilterRegExp()

构建的内置代理的功能冲突
mySearchField=QLineEdit()
QObject.connect(mySearchField, SIGNAL("textChanged(QString)"), myProxyModel.setFilterRegExp)

在输入 mySearchField 时,我确实看到代理的 filterAcceptsRow() 不断被调用。但是因为我已经用自定义逻辑覆盖了它的 filterAcceptsRow() 方法,所以不会对输入到 lineedit 中的文本进行过滤。

问题:是否可以保留两种功能:使用代理的内置 .setFilterRegExp() 和自定义 filterAcceptsRow() 方法的简单性?

QSortFilterProxyModel 的构造函数中,首先声明了一个 self.searchText 变量:

class TaskProxyModel(QSortFilterProxyModel):
    def __init__(self):
        super(TaskProxyModel, self).__init__()
        self.searchText=None

定义代理的 setSearchText() 自定义 setter 链接到 lineeditlineedit 用于输入搜索关键字):

class MyProxyModel(QSortFilterProxyModel):
    def __init__(self):
        super(MyProxyModel, self).__init__()
        self.searchText=None

    def setSearchText(self, arg=None):
        self.searchText=arg
        self.reset()

lineedit 链接到代理的 setSearchText() setter-方法:

myProxy=MyProxyModel()
lineEdit=QLineEdit()
lineEdit.textChanged.connect(myProxy.setSearchText)

在代理的 filterAcceptsRow() 开始时检查 self.searchText 是否不是 None。 如果没有,那么做一些逻辑:

class MyProxyModel(QSortFilterProxyModel):
    def __init__(self):
        super(MyProxyModel, self).__init__()
        self.searchText=None

    def filterAcceptsRow(self, rowProc, parentProc):
        sourceModel=self.sourceModel()      
        indexProc=sourceModel.index(rowProc, 0, parentProc)
        node=sourceModel.data(indexProc, Qt.UserRole).toPyObject()

        if self.searchText:
            nodeName=node.getName()
            if nodeName and not str(self.searchText).lower() in nodeName.lower():
                return False