можно ли изменить ориентацию коробки в gtk?

Я сделал класс, родительским классом которого является gtk.box в vala. ссылка на конструктор коробки не поддерживается, так как я могу установить ориентацию коробки в конструкторе??


person angrymadcat    schedule 03.06.2012    source источник
comment
Что вы имеете в виду под ориентацией? Не похоже, чтобы конструктор Box все равно принимал аргументы: unstable.valadoc .org/#!api=gtk+-2.0/Gtk.Box.   -  person Hassan    schedule 03.06.2012
comment
В gtk+-2.0 Gtk.Box не имеет конструктора (это абстрактный класс, который не может быть создан), но в gtk+-3.0 он есть. См. valadoc.org/#!api=gtk+-3.0/Gtk.Box .Коробка   -  person nemequ    schedule 04.06.2012


Ответы (1)


Хотя вызов this.set_orientation (Gtk.Orientation.VERTICAL) может работать, более правильным способом сделать это было бы установить свойство orientation во время построения, как это делает конструктор по умолчанию Gtk.Box. В Vala вы бы сделали что-то вроде этого:

public class MyBox : Gtk.Box {
  public MyBox () {
    GLib.Object (orientation: Gtk.Orientation.VERTICAL);
  }
}

На уровне C это немного отличается от простого вызова set_orientation... он сгенерирует что-то вроде этого (упрощено для ясности):

MyBox* my_box_new () {
  return g_object_new (GTK_TYPE_BOX, "orientation", GTK_ORIENTATION_VERTICAL, NULL);
}

С другой стороны, вызов set_orientation (или установка свойства orientation) будет генерировать что-то вроде этого:

MyBox* my_box_new () {
  MyBox* self = g_object_new (GTK_TYPE_BOX, NULL);
  gtk_box_set_orientation (GTK_BOX(self), GTK_ORIENTATION_VERTICAL);
  return self;
}

Разница в том, что для первой версии ориентация будет установлена ​​правильно во время инстанцирования (другими словами, во время построения блока каждого из классов-предков), тогда как для второй версии объект сначала будет создан с неправильной ориентацией, то ориентация будет изменена. Я не уверен, является ли эта разница существенной для Gtk.Box, но в некоторых случаях она очень важна, так что, вероятно, неплохо выработать привычку делать это правильно.

Если вы не уверены, что я имею в виду под «конструктивным блоком», посмотрите раздел в учебном пособии Vala на Построение в стиле GObject.

person nemequ    schedule 04.06.2012
comment
Хороший! Я понял. Почему атрибут set_ориентация() и ориентация отсутствуют в документации (valadoc)? он показывает только общедоступные методы? - person angrymadcat; 04.06.2012
comment
Они есть в документации для Gtk.Orientable, которую реализует Gtk.Box. - person nemequ; 04.06.2012
comment
Просто чтобы быть педантичным, он будет генерировать g_object_new(MY_TYPE_BOX, ...) в обоих случаях, но это не имеет значения! - person Tristan Brindle; 16.10.2013