QSortFilterProxyModel中的QRegExp - 查找列表中的所有项

0 投票
1 回答
1345 浏览
提问于 2025-04-19 16:04

我在使用PyQt的时候,遇到了一个问题,就是在用QSortFilterProxyModel时,使用setFilterRegExp()这个方法。我的源模型输出的是1到30的整数,而QSFPM的目的是过滤这些数字,只留下我提供的列表中的数字。

proxy.setFilterRegExp(QRegExp('^%s{1,1}%' % sourceModel.wantedNumbersList()))

如果手动输入想要的数字:

proxy.setFilterRegExp(QRegExp('^[2, 3, 4, 5, 8, 9, 10, 18, 19]{1,1}%'))

最后的结果是只留下了[1, 2, 3, 4, 5, 8, 9]。但是我想要的数字大于等于10的却没有出现在结果里,而1却莫名其妙地被包含在内。

我还尝试了:

proxy.setFilterRegExp(RegExp('^[2|3|4|15]{1,1}$')))

结果是[1, 2, 3, 4, 5],也就是说,它把我想要的数字15理解成了1和5。

根据文档,我以为用^和$可以找到每个数字的精确匹配,但实际上却找到了所有数字的所有出现。

祝好

1 个回答

1

这里的意思是,字符类会把里面的字符当作单独的字符来处理,除非你使用了范围的写法。那么,

[2, 3, 4, 5, 8, 9, 10, 18, 19]

匹配到的内容包括:2,3,(又一次)、[...]、19,(又一次)、1(再一次)等等。

实际上,正则表达式应该是这样的:

proxy.setFilterRegExp(QRegExp('^(2|3|4|5|8|9|10|18|19)$'))

或者尽量简化成这样:

proxy.setFilterRegExp(QRegExp('^([234589]|1[089])$'))

我想你可能需要改变一下 sourceModel.wantedNumbersList() 的表现形式(做一些字符串处理),或者手动输入。

如果你选择用字符串处理的方法,我建议你去掉方括号,然后把逗号后面跟着的空格替换成一个竖线 |,接着用 '^(%s)$' 来做正则匹配。

撰写回答