【问题标题】:How to subclass GTK IconView in Vala with Glade如何使用 Glade 在 Vala 中继承 GTK IconView
【发布时间】:2019-01-20 15:34:16
【问题描述】:

当我尝试使用 Glade 在 Vala 中对 GTK IconView 进行子类化时,我遇到了分段错误。这是 Vala 中的错误,还是我做错了什么?这是使用 vala 0.42.3。也许这与 IconView 没有base() 构造函数有关? (见:Chain up to 'Gtk.Box.new' not supported

test.vala:

using Gtk;

public class IconViewSubclass : Gtk.IconView {
  public IconViewSubclass() {

  }
}

public static int main(string[] args) {
  Gtk.init(ref args);
  var builder = new Builder.from_file("test.glade");
  var window = builder.get_object("window") as Window;
  var iconViewSubclass = builder.get_object("iconViewSubclass") as IconViewSubclass;
  iconViewSubclass.set_pixbuf_column(0);
  iconViewSubclass.set_text_column(1);

  window.show_all();
  Gtk.main();
  return 0;
}

test.glade:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkListStore" id="store">
    <columns>
      <!-- column-name pixbuf -->
      <column type="GdkPixbuf"/>
      <!-- column-name text -->
      <column type="gchararray"/>
    </columns>
  </object>
  <object class="GtkWindow" id="window">
    <property name="can_focus">False</property>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkIconView" id="iconViewSubclass">
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="margin">6</property>
        <property name="model">store</property>
      </object>
    </child>
  </object>
</interface>
$ valac --pkg gtk+-3.0 test.vala && ./test
Segmentation fault

【问题讨论】:

    标签: oop gtk gnome vala glade


    【解决方案1】:

    看起来您需要使用expose_object() 让 Gtk.Builder 知道 IconViewSubclass 的存在。这允许在 Builder UI 定义文件中使用子类型。这是一个编译且不发生段错误的示例:

    test.ui:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Generated with glade 3.22.1 -->
    <interface>
      <requires lib="gtk+" version="3.18"/>
      <object class="GtkWindow" id="window">
        <property name="window-position">GTK_WIN_POS_CENTER</property>
        <property name="default-height">250</property>
        <property name="default-width">250</property>
        <child>
          <placeholder/>
        </child>
        <child>
          <object class="IconViewSubclass" id="iconViewSubclass">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="margin">6</property>
          </object>
        </child>
      </object>
    </interface>
    

    test.vala:

    using Gtk;
    
    public class IconViewSubclass : Gtk.IconView {}
    
    public static int main(string[] args) {
      Gtk.init(ref args);
      var builder = new Builder ();
      builder.expose_object ("IconViewSubclass", new IconViewSubclass ());
      try {
        builder.add_from_file ("test.ui");
      } catch (Error error) {
        print (@"$(error.message)");
      }
      var window = builder.get_object ("window") as Window;
      var iconViewSubclass = (IconViewSubclass)builder.get_object ("iconViewSubclass");
      iconViewSubclass.set_pixbuf_column (0);
      iconViewSubclass.set_text_column (1);
    
      window.show_all();
      Gtk.main();
      return 0;
    }
    

    您可能想考虑使用带有 Vala [GtkTemplate][GtkChild][GtkCallback] 属性的模板。这些属性会告诉 Vala 为你生成样板代码。

    【讨论】:

      【解决方案2】:

      AIThomas 的代码运行良好,但是,为了继续在 Glade 中编辑 UI 文件,我必须添加一个目录文件,如下所示:

      <?xml version="1.0" encoding="UTF-8"?>
      <glade-catalog name="test" depends="gtk+">
        <glade-widget-classes>
          <glade-widget-class name="IconViewSubclass" generic-name="iconviewsubclass" title="IconViewSubclass" parent="GtkIconView"/>
        </glade-widget-classes>
        <glade-widget-group name="test" title="test">
          <glade-widget-class-ref name="IconViewSubclass"/>
        </glade-widget-group>
      </glade-catalog>
      

      我还发现Vala 中的子类名称必须与 UI XML 中的小部件名称完全对应,即将test.vala 中的IconViewSubclass 更改为IconViewSubclass2 会得到: p>

      $ valac --pkg gtk+-3.0 test.vala && ./test
      test.ui:14:1 Invalid object type 'IconViewSubclass'Segmentation fault
      

      您还可以使用命名空间作为类名的一部分,即namespace Foo { public class Bar : Baz } 应该适用于 UI XML 文件中 FooBar 类型的小部件。

      【讨论】:

        猜你喜欢
        • 2011-03-31
        • 1970-01-01
        • 2012-12-27
        • 2012-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多