TreeModelFilter в GTK / Perl - Вопрос о set_visible_func - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь отфильтровать хранилище списков, используя 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 списка ($ unfiltered_store) и, еслиэто определенное значение, затем оно фильтруется в $ Filter_store.

Может кто-нибудь помочь мне с синтаксисом на этом?Я проверил несколько сайтов, но они на других языках и используют другой синтаксис (например, 'new_filter' - не существует с Perl GTK).Это наиболее элегантное решение для исправления, которое мне нужно сделать, и я предпочел бы научиться использовать его, а не использовать метод грубой силы извлечения и сохранения отфильтрованных данных.

1 Ответ

0 голосов
/ 07 февраля 2019

Метод 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) });
...