Как создать подкласс GTK IconView в Vala с помощью Glade - PullRequest
0 голосов
/ 20 января 2019

Когда я пытаюсь создать подкласс GTK IconView в Vala, используя Glade, я получаю ошибку сегментации.Это ошибка в Вала, или я просто делаю что-то не так?Это использует vala 0.42.3.Может быть, это связано с тем, что IconView не имеет конструктора base()?(см .: Цепочка до 'Gtk.Box.new' не поддерживается )

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

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Код AIThomas работал отлично, однако, чтобы продолжить редактирование UI-файла в Glade, мне пришлось добавить файл каталога следующим образом:

<?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 должно точно соответствовать имени виджета в пользовательском интерфейсе XML , т. Е. Изменение IconViewSubclass на IconViewSubclass2 в test.vala даст вам:

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

Вы также можете использовать пространство имен как часть имени класса, т.е. namespace Foo { public class Bar : Baz } должно работать для виджета типа FooBar в XML-файле интерфейса пользователя.

0 голосов
/ 20 января 2019

Похоже, вы должны сообщить Gtk.Builder, что IconViewSubclass существует с использованием expose_object(). Это позволяет использовать подтип в файле определения Builder UI. Вот пример, который компилирует и не выполняет segfault:

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 сгенерировать для вас код котельной плиты.

...