如何使用 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 链接到 lineedit
(lineedit
用于输入搜索关键字):
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
在实现 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 链接到 lineedit
(lineedit
用于输入搜索关键字):
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