【问题标题】:Constructing Vala Gtk object using builder contents使用构建器内容构造 Vala Gtk 对象
【发布时间】:2013-03-05 20:15:13
【问题描述】:

如果能够创建一个使用 builder 加载其内容的新小部件,例如。

public class MyDialog : Dialog
  {
    public MyDialog
      {
        Gtk.Builder builder = new Gtk.Builder ();
        builder.add_from_file ("dialog.ui");
        this = builder.get_object ("my_dialog") as Gtk.Widget;
      }
    }

显然这不起作用,因为this = 是一个无效的分配,但我想知道是否有一种方法可以使用从构建器加载的内容来设置小部件的内容。

与此同时,我已将 this = ... 替换为

var content = get_content_area ();
var dialog = builder.get_object ("my_dialog") as Gtk.Widget;
var _content = (dialog as Dialog).get_content_area ();
_content.reparent (content);

这确实有效,但能够直接加载对我来说仍然有意义。

谢谢。

【问题讨论】:

    标签: gtk vala


    【解决方案1】:

    万一以后有人偶然发现这个问题,Vala 0.22 提供了复合小部件模板,这是解决上述问题的一个更简单的方法。复合模板允许您在 Glade 中定义一个小部件,并使用属性告诉 Vala 您的类的哪些位引用小部件的哪些元素,并连接回调,而完全无需手动使用 Gtk.Builder

    详情请见http://blogs.gnome.org/tvb/2013/05/29/composite-templates-lands-in-vala/

    【讨论】:

      【解决方案2】:

      我们在 Geary 中广泛执行此操作。我使用最多的技巧根本不是在 Glade 中构建包含对象(即 Gtk.Dialog),而是构建它的内容。然后你可以在 Vala 中编写对话框/窗口本身。

      在 Glade 3.15 出现之前,这样做有点痛苦,因为它没有明确支持 Box、Grid 和其他组件作为顶层。如果你还没有升级,我推荐它。

      【讨论】:

      • 嗯,这很有趣,因为多年来我什至没有尝试将 Box 用作顶级,因为它从来没有用过。非常感谢,这就是我从现在开始要做的事情,并不是说重新设置内容不起作用,只是现在似乎没有必要。
      【解决方案3】:

      不,不可能。 C++ 绑定到Gtk.Builderhas this,但不幸的是它依赖于 C++ 模板,并且尚未在任何其他绑定中实现。

      【讨论】:

      • 嗯,太糟糕了。您认为重新设置 content_area 的方法有什么问题吗?
      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2018-07-02
      • 2011-10-26
      • 2014-06-04
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多