我正在尝试使用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不存在)。 这是我需要进行修复的最优雅的解决方案,我宁愿学习如何使用它,而不是使用蛮力方法来提取和保存已过滤的数据。
答案 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) });