Qt QSortFilterProxy模型和按整数、布尔值过滤

Qt QSortFilterProxy模型和按整数、布尔值过滤,qt,qsortfilterproxymodel,Qt,Qsortfilterproxymodel,我有一个连接到QSqlQueryModel的QSortFilterProxyModel。在基础查询中有布尔字段和整数字段。我想通过这些布尔值、整数等值进行过滤。令人惊讶的是(也许我错了)QSortFilterProxyModel只按字符串过滤。例如,如果要过滤ID(通常是整数),这就是一个“问题”。例如,如果您尝试过滤一个ID=22,则会得到所有内部带有“22”的ID(122、222、322等)。有关非非常优雅的解决方案,请参阅 但如何按布尔字段进行过滤?有人能给点提示吗?我想我必须为QSort

我有一个连接到
QSqlQueryModel
QSortFilterProxyModel
。在基础查询中有布尔字段和整数字段。我想通过这些布尔值、整数等值进行过滤。令人惊讶的是(也许我错了)
QSortFilterProxyModel
只按字符串过滤。例如,如果要过滤ID(通常是整数),这就是一个“问题”。例如,如果您尝试过滤一个
ID=22
,则会得到所有内部带有“22”的ID(122、222、322等)。有关非非常优雅的解决方案,请参阅


但如何按布尔字段进行过滤?有人能给点提示吗?我想我必须为
QSortFilterProxyModel
创建子类,或者有其他方法吗?

有点晚了,但它可能对其他人有用(也许一些真正的专家可能会添加精度/更正)

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)
然后重写过滤器AcceptsRow,对ID而不是正则表达式进行测试

您还可以同时使用这两种方法(或更多方法)。为此,请在您的过滤器AcceptsRow方法中从中读取数据

myProxyModel.data(source_row, QtCore.Qt.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())

一个简单的解决方案是将regexp与开始和结束锚点一起使用:

 proxyModel->setFilterRegExp(QString("^%1$").arg(id));

您可以使用:
filterModel->setFilterFixedString(“false”)

或者根据需要
filterModel->setFilterFixedString(“true”)

似乎是专家建议的解决方案: