gpt4 book ai didi

qt - QSortFilterProxyModel 并按整数、 bool 值过滤

转载 作者:行者123 更新时间:2023-12-01 22:41:49 24 4
gpt4 key购买 nike

我有一个连接到 QSqlQueryModelQSortFilterProxyModel。在底层查询中有 bool 值和整数字段。我想按这些 bool 值、整数等值进行过滤。令人惊讶的是(或者我错了)QSortFilterProxyModel 仅按字符串进行过滤。如果您想过滤 ID(通常是整数),这就是一个“问题”。例如,如果您尝试过滤 ID=22,您将获得所有内部带有“22”的 ID(122、222、322 等)。参见 this link对于一个不太优雅的解决方案。

但是您将如何按 bool 字段进行过滤?有人可以给一些提示吗?我想我必须继承 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)

然后覆盖 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())

关于qt - QSortFilterProxyModel 并按整数、 bool 值过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12036119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com