TreeModelFilter в GTK/Perl - Вопрос о set_visible_func
Я пытаюсь отфильтровать хранилище списков с помощью GTK2::TreeModelFilter. Я не могу найти пример онлайн, который использует Perl, и я получаю синтаксические ошибки. Может кто-нибудь помочь мне с синтаксисом ниже? $ Unfiltered_store - это хранилище списков.
$filtered_store = Gtk2::TreeModeFilter->new($unfiltered_store);
$filtered_store->set_visible_func(get_end_products, $unfiltered_store);
$combobox = Gtk2::ComboBoxEntry->new($filtered_store,1);
Тогда где-то внизу:
sub get_end_products {
my ($a, $b) = @_;
warn(Dumper(\$a));
warn(Dumper(\$b));
return true; # Return all rows for now
}
В конечном итоге я хочу взглянуть на столбец 14 listore ($unfiltered_store) и, если это определенное значение, тогда он отфильтровывается в $ Filter_store.
Может кто-нибудь помочь мне с синтаксисом на этом? Я проверил несколько сайтов, но они на других языках и используют другой синтаксис (например, 'new_filter' - не существует с Perl GTK). Это наиболее элегантное решение для исправления, которое мне нужно сделать, и я бы предпочел узнать, как его использовать, а не использовать метод грубой силы извлечения и сохранения отфильтрованных данных.
1 ответ
set_visible_func
Метод отфильтрованного хранилища должен получить подчиненную ссылку в качестве первого аргумента, но здесь вы не передаете подчиненную ссылку:
$filtered_store->set_visible_func(get_end_products, $unfiltered_store);
Это вместо этого вызовет подпрограмму get_end_products
и затем передайте его возвращаемое значение (которое не является дополнительной ссылкой). Чтобы исправить это, добавьте оператор ссылки \&
перед суб-именем:
$filtered_store->set_visible_func(\&get_end_products, $unfiltered_store);
По поводу вашего другого вопроса в комментариях: Согласно документации, параметр пользовательских данных передается в качестве третьего параметра get_end_products
так что вы должны определить это так:
sub get_end_products {
my ($model, $iter, $user_data) = @_;
# Do something with $user_data
return TRUE;
}
Если по какой-то причине $unfiltered_store
не передается get_end_products
, вы можете попробовать передать его с помощью анонимного sub
вместо этого, вот так:
$filtered_store->set_visible_func(
sub { get_end_products( $unfiltered_store) });