GTK / Perl中的TreeModelFilter-关于set_visible_func的问题

时间:2019-02-06 21:13:05

标签: perl treeview gtk gtk2

我正在尝试使用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
 }

最终,我想看一下listore的第14列($ unfiltered_store),如果它是某个值,则将其过滤到$ filtered_store中。

有人可以帮我解决这个问题吗?我检查了很多站点,但它们使用的是其他语言,并且使用了不同的语法(例如'new_filter'-Perl GTK不存在)。 这是我需要进行修复的最优雅的解决方案,我宁愿学习如何使用它,而不是使用蛮力方法来提取和保存已过滤的数据。

1 个答案:

答案 0 :(得分:0)

过滤后的商店的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);

关于您在评论中的其他问题: According to the documentation用户数据参数作为 third 参数传递给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) });