我有QSortFilterProxyModel
与QSqlQueryModel
相关联。在底层查询中有布尔和整数字段。我想过滤这些布尔值,整数等值。令人惊讶的是(或者我错了)QSortFilterProxyModel
只能按字符串过滤。例如,如果要过滤ID(通常是整数),则这是一个“问题”。如果您尝试过滤ID=22
,则会获得内部带有“22”的所有ID(122,222,322等)。有关非常优雅的解决方案,请参阅this link。
但是你如何按布尔字段过滤?有人可以提一些暗示吗?我想我必须继承QSortFilterProxyModel
,还是有另一种方法?
答案 0 :(得分:4)
有点晚了,但它可能对其他人有用(也许一些真正的专家可能会增加精确度/更正)!
QSortFilterProxyModel 实例使用方法
bool QSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent)
确定是否应该保留给定的行。 默认情况下,它只会测试
返回的字符串myProxyModel.data(source_row, QtCore.Qt.DisplayRole)
使用
匹配您之前可能设置的正则表达式myProxyModel.setFilterRegExp(myRegex)
由于您继承此 QSortFilterProxyModel ,您可以轻松定义一种新的方式来过滤您的商品。
添加一个方法来设置您要检查的ID
myProxyModel.setFilterID(myRefId)
然后覆盖 filterAcceptsRow 来对ID而不是正则表达式进行测试!
您还可以保留两种方法(或更多)。为此,请在 filterAcceptsRow 方法中读取
中的数据myProxyModel.data(source_row, QtCore.Qt.UserRole)
而不是 DisplayRole 。设置 UserRole 时,您可以存储任何数据,而不仅仅是字符串。 这是一个例子(在python中,它的编写时间较短,但它在任何语言中的工作方式都相同),我们将自定义代理对象存储到模型中:
from PyQt4 import QtGui
from PyQt4 import QtCore
class MyDummyObj(object):
def __init__(self, objLabel, objID, hidden=False)
self.__label = objLabel
self.__id = objLabel
self.__hidden = hidden
def getLabel(self):
return self.__label
def getID(self):
return self.__id
def isSecret(self):
return self.__hidden
class MyProxyModel(QtGui.QSortFilterProxyModel):
def __init__(self):
super(MyProxyModel, self).__init__()
self.__testID = None
self.__showHidden = False
def setFilterID(self, filterID):
self.__testID = filterID
def showHiddenRows(self, showHidden=False)
self.__showHidden = showHidden
def filterAcceptsRow(self, sourceRow, sourceParent):
model = self.sourceModel()
myObject = model.data(model.index(sourceRow, 0, sourceParent),
QtCore.Qt.UserRole).toPyObject()
if not self.__showHidden:
if myObject.isSecret():
return False
if self.__testID is not None:
return self.__testID == myObject.getID()
return self.getFilterRegExp().exactMatch(myObject.getLabel())
答案 1 :(得分:0)
一个简单的解决方案是将regexp与开始和结束锚点一起使用:
proxyModel->setFilterRegExp(QString("^%1$").arg(id));
答案 2 :(得分:0)
您可以使用 setFilterFixedString 非常明确地过滤布尔角色:filterModel->setFilterFixedString("false")
或 filterModel->setFilterFixedString("true")
根据需要。