瓦拉。如何删除 GTK 容器的所有子项?
Posted
技术标签:
【中文标题】瓦拉。如何删除 GTK 容器的所有子项?【英文标题】:Vala. How do you delete all the children of a GTK container? 【发布时间】:2016-07-12 22:37:55 【问题描述】:解决了。示例见回复。
我有一个装有孩子的容器。我需要删除所有的孩子。这在 C 中很容易。Vala 不起作用。
以下代码产生一个错误缺少集合的类型参数。
var a_box = new Box (Orientation.VERTICAL, 0);
// Add some children
List children = a_box.get_children();
foreach (Widget element in children)
我测试了此代码的 20 多种变体以及多种数据类型。当我没有收到缺少类型的投诉时,我最终会得到一个不能用作小部件的数据类型,这意味着我无法销毁它。
使用 Vala,而不是 C 或 Python 或任何容易做到这一点的许多语言,如何删除容器的所有子级?
据我所知,获取孩子的唯一方法是作为列表,但在 Vala 中,列表条目不能用于删除或销毁小部件。
删除和销毁 C 中的工作。我有几个基于 C 的应用程序同时执行这两种操作。 Vala 0.30 编译器拒绝从 C 到 Vala 的所有翻译,并拒绝编译来自 Valadocs 等的示例。
【问题讨论】:
Re: 来自valadoc的例子,你能提供任何具体的例子吗?我敢肯定 Florian 想知道任何损坏的例子…… @nemequ,我扩展了有关 Valadocs 和其他来源的内容。 Valadocs 需要 php cmets 之类的东西,人们可以在其中提供和讨论使用示例。 【参考方案1】:要更正有关缺少类型参数的错误,只需提供类型参数即可。 Gtk.Container.get_children() 的签名表示类型是 List<weak Widget>
,所以让我们使用它:
GLib.List<weak Gtk.Widget> children = container.get_children ();
foreach (Gtk.Widget element in children)
container.remove (element);
当然,你也可以只使用类型推断:
var children = container.get_children ();
foreach (Gtk.Widget element in children)
container.remove (element);
甚至完全避免使用临时变量:
foreach (Gtk.Widget element in container.get_children ())
container.remove (element);
但我能想到的最简单的方法是:
container.foreach ((element) => container.remove (element));
【讨论】:
太棒了。当我完全复制您的代码时,所有四个示例都有效。 最初我尝试了“var children =”的变体,但编译器或执行抱怨类型不兼容。我没有保留失败示例的副本。我添加了 printf 试图找出循环中可用的内容。再次存在类型不兼容。我会回去再次测试。对于此代码的后续开发,我需要知道它是框还是网格等,以报告删除的内容。 .forall 描述说它删除了容器对象内部的东西。这表明对于某些容器类型 .forall 会删除太多。 .forall 适用于一个盒子。我希望网格和类似的容器在 .forall 之后可能会失败。我没有找到关于哪些容器会失败的文档。我会坚持使用 .get_children 的版本。 实际上,我认为它会按预期对网格起作用。我相信它指的是在您的小部件和它们自身之间添加中介的小部件;例如,Gtk.ListBox
将自动创建一个 Gtk.ListBoxRow
来保存您的小部件。 forall
将调用Gtk.ListBoxRow
上的回调,但get_children
也将返回Gtk.ListBoxRow
,所以这并不重要……您只需要了解both 个案例。
最终用户不应使用.forall()
,因为他们只应操作自己的小部件,并让Container
删除其任何内部的实现细节小部件。在非实现代码中循环小部件的正确方法是.foreach()
。除非您知道您需要 .forall()
,否则不应使用它,并且通常作为小部件的用户您并不真正需要它(如果您认为您需要它,您可能有一个更大的问题和/或糟糕的设计)。以上是关于瓦拉。如何删除 GTK 容器的所有子项?的主要内容,如果未能解决你的问题,请参考以下文章