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) });
Другие вопросы по тегам