过滤 QTableView 中的多列

Posted

技术标签:

【中文标题】过滤 QTableView 中的多列【英文标题】:Filtering multiple columns in QTableView 【发布时间】:2021-10-04 17:57:36 【问题描述】:

我需要创建一个过滤器(搜索),它将在多个列中查找。通过在网上搜索,我从这个链接How to filter Multiple column in Qtableview?找到了 Alex P. 的答案

按照他的回答,我尝试像这样调用 setFilterByColumn:

他的回答

class MultiFilterMode:
    AND = 0
    OR = 1


class MultiFilterProxyModel(QSortFilterProxyModel):
    def __init__(self, *args, **kwargs):
        QSortFilterProxyModel.__init__(self, *args, **kwargs)
        self.filters = 
        self.multi_filter_mode = MultiFilterMode.AND

    def setFilterByColumn(self, column, regex):
        if isinstance(regex, str):
            regex = re.compile(regex)
        self.filters[column] = regex
        self.invalidateFilter()

    def clearFilter(self, column):
        del self.filters[column]
        self.invalidateFilter()

    def clearFilters(self):
        self.filters = 
        self.invalidateFilter()

    def filterAcceptsRow(self, source_row, source_parent):
        if not self.filters:
            return True

        results = []
        for key, regex in self.filters.items():
            text = ''
            index = self.sourceModel().index(source_row, key, source_parent)
            if index.isValid():
                text = self.sourceModel().data(index, Qt.DisplayRole)
                if text is None:
                    text = ''
            results.append(regex.match(text))

        if self.multi_filter_mode == MultiFilterMode.OR:
            return any(results)
        return all(results)

我怎么称呼它

def __init__(self, window):
    self.filter_proxy_model_templates_shots = MultiFilterProxyModel()


def update_search(self):
    self.filter_proxy_model_templates_shots.setSourceModel(model)
    self.tableViewShotsTemplates.setModel(self.filter_proxy_model_templates_shots)

    for i in range(model.columnCount()):
        self.lineEditSearchShotSets.textChanged.connect(lambda text, col=i:
                               self.filter_proxy_model_templates_shots.setFilterByColumn
                               (col, QRegExp(text, Qt.CaseInsensitive, QRegExp.FixedString)))

但我得到一个错误:

AttributeError: 'PySide2.QtCore.QRegExp' object has no attribute 'match'

我应该如何修改他的代码以使其工作?提前谢谢!

我正在使用 Python 2.7 和 PySide2

【问题讨论】:

如QRegExp 文档中所示,没有match 函数。除了建议的答案,请考虑改用QRegularExpression。 【参考方案1】:

使用QRegex::indexIn()方法:

results.append(regex.indexIn(text) != -1)

【讨论】:

以上是关于过滤 QTableView 中的多列的主要内容,如果未能解决你的问题,请参考以下文章

如何让QListView显示多列 QTableView与QListView区别在哪里

如何在QTableView Qt C ++中将sqlite db数据显示为多列视图?

使用 QSortFilterProxyModel 过滤 QTableView 后保留选择

QTableview 从过滤模型中选择项目

Qt如何实现这种效果,展示多组多列的数据,某些列可放按钮接收事件

如何在 QTableView 的列中显示下拉列表并根据下拉列表进行过滤