2

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

但是您将如何按布尔字段过滤?有人可以给点提示吗?我想我必须子类化QSortFilterProxyModel,还是有另一种方法?

4

3 回答 3

6

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

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())
于 2013-05-30T09:17:06.400 回答
0

一个简单的解决方案是将正则表达式与开始和结束锚点一起使用:

 proxyModel->setFilterRegExp(QString("^%1$").arg(id));
于 2020-08-28T13:12:27.840 回答
0

您可以使用setFilterFixedString明确过滤布尔角色:filterModel->setFilterFixedString("false")filterModel->setFilterFixedString("true")根据需要。

于 2021-01-05T14:59:50.163 回答