2014-09-03 8 views
0

Использование с помощью PyQt &, застрявшего при использовании setFilterRegExp() с QSortFilterProxyModel. Исходная модель выводит целые числа 1-30, а QSFPM должен фильтровать 1-30, оставляя только числа в поставляемом списке.QRegExp для QSortFilterProxyModel - Найти все товары в A

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}$'))) 

..which дал [1,2,3,4,5] т.е. интерпретировать нужный номер 15, как 1 & 5.

Из документов, я подумал^& $ найдет точное совпадение каждого, но вместо этого найдет все вхождения всех чисел.

Многие Привет

+0

Можете ли вы предоставить образец ввода и ваш желаемый результат? –

+0

Привет, Fede. Переписал вопрос. Оказывается, я предоставил запрошенную информацию без копирования в полном классе QSqlTableModel. – user2422819

ответ

1

Дело в том, что характер классы лечить символы внутри них как отдельные символы, если при не использовании диапазона. Итак, что:

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

Будет матч: 2, ,,, 3, , (опять же), [...], 1, 9, , (опять же),, 1 (опять же), и т.д.

Что регулярное выражение должно выглядеть на самом деле:

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

Или укорачивается как можно больше:

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

Я думаю, вам придется изменить способ отображения sourceModel.wantedNumbersList() (некоторые строковые манипуляции) или ввести его вручную.

Если вы сделаете это с помощью строковых манипуляций, я бы предложил разделить квадратные скобки и заменить запятую, а затем пробелом на трубу |, а затем использовать '^(%s)$' для регулярного выражения.

+0

Эй @ Джерри. Большое спасибо, это работает отлично. Новая функция теперь принимает исходный список и преобразует его в строку (2 | 3 | 4 | 5 | 8 | 9 | 10 | 18 | 19), через «newL =» | ».join ([str (t) для t в self.originalIntegerList()]); return "(" + newL + ")". QRegExp QSFPM теперь «% s $»% self.listAsStringForRegExp() ». – user2422819

+0

@ user2422819 Добро пожаловать :) И я заметил, что я использовал знак '%' в своем регулярном выражении вместо '$', мой плохой. – Jerry