Python 如何使用QSortFilterProxyModel';s setFilterRegExp()和filterAcceptsRow()一起
在实现Python 如何使用QSortFilterProxyModel';s setFilterRegExp()和filterAcceptsRow()一起,python,qt,model,pyqt,Python,Qt,Model,Pyqt,在实现QSortFilterProxyModel(与QTableView一起使用)时,我通过在代理中定义一些自定义逻辑(关于如何过滤项),覆盖了代理的filterAcceptsRow()方法。现在看来,覆盖代理的“默认值”filterAcceptsRow()与内置代理围绕.setFilterRegExp()构建的功能冲突 在键入mySearchField时,我确实看到代理的filterAcceptsRow()不断被调用。但由于我使用自定义逻辑覆盖了它的filteraccessrow()方法,因此
QSortFilterProxyModel
(与QTableView
一起使用)时,我通过在代理中定义一些自定义逻辑(关于如何过滤项),覆盖了代理的filterAcceptsRow()
方法。现在看来,覆盖代理的“默认值”filterAcceptsRow()
与内置代理围绕.setFilterRegExp()构建的功能冲突
在键入mySearchField
时,我确实看到代理的filterAcceptsRow()
不断被调用。但由于我使用自定义逻辑覆盖了它的filteraccessrow()
方法,因此不会对输入到lineedit中的文本进行过滤
问题:是否可以保留这两种功能:使用代理的内置.setFilterRegExp()
和自定义的filterAcceptsRow()
方法的简单性?在QSortFilterProxyModel
的构造函数中,首先声明self.searchText
变量:
class TaskProxyModel(QSortFilterProxyModel):
def __init__(self):
super(TaskProxyModel, self).__init__()
self.searchText=None
定义要链接到lineedit
的代理的setSearchText()
自定义setter(lineedit
用于输入搜索关键字):
将lineedit
链接到代理的setSearchText()
setter方法:
myProxy=MyProxyModel()
lineEdit=QLineEdit()
lineEdit.textChanged.connect(myProxy.setSearchText)
在代理的filterAcceptsRow()
开头,检查self.searchText
是否为无。
如果没有,则执行一些逻辑:
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
myProxy=MyProxyModel()
lineEdit=QLineEdit()
lineEdit.textChanged.connect(myProxy.setSearchText)
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