#gtk #vala
#gtk #вала
Вопрос:
Я хочу обновить метки при изменении активного элемента в Gtk.ComboBox.
Вот как я создаю поля со списком
public class Epoch.CitiesChooser : Gtk.Grid {
string[] cities = {"Guwahati", "Paris", "London", "New York"};
public Gtk.ComboBox city1box;
public Gtk.ComboBox city2box;
public Gtk.ComboBox city3box;
public Gtk.ComboBox city4box;
enum Column {
CITY
}
construct {
var liststore = new Gtk.ListStore (1, typeof (string));
for (int i = 0; i < cities.length; i ) {
Gtk.TreeIter iter;
liststore.append (out iter);
liststore.set (iter, Column.CITY, cities[i]);
}
city1box = new Gtk.ComboBox.with_model (liststore);
var cell1 = new Gtk.CellRendererText ();
city1box.pack_start (cell1, false);
city1box.set_attributes (cell1, "text", Column.CITY);
city1box.set_active (0);
var city2box = new Gtk.ComboBox.with_model (liststore);
var cell2 = new Gtk.CellRendererText ();
city2box.pack_start (cell2, false);
city2box.set_attributes (cell2, "text", Column.CITY);
city2box.set_active (1);
var city3box = new Gtk.ComboBox.with_model (liststore);
var cell3 = new Gtk.CellRendererText ();
city3box.pack_start (cell3, false);
city3box.set_attributes (cell3, "text", Column.CITY);
city3box.set_active (2);
var city4box = new Gtk.ComboBox.with_model (liststore);
var cell4 = new Gtk.CellRendererText ();
city4box.pack_start (cell4, false);
city4box.set_attributes (cell4, "text", Column.CITY);
city4box.set_active (3);
this.attach (city1box, 0, 0);
this.attach (city2box, 0, 1);
this.attach (city3box, 0, 2);
this.attach (city4box, 0, 3);
}
}
И вот как я создаю ярлыки и пытаюсь их обновить:
public class Epoch.LabelsGrid : Object {
public Gtk.Label face1_label;
public Gtk.Label face2_label;
public Gtk.Label face3_label;
public Gtk.Label face4_label;
// public Epoch.CitiesChooser cities_chooser;
construct {
face1_label = new Gtk.Label ("");
face1_label.set_markup ("<span font_desc='Inter 14'><b>Guwahati</b></span>");
face1_label.halign = Gtk.Align.CENTER;
face1_label.hexpand = true;
face1_label.margin_top = 6;
face1_label.set_ellipsize (END);
face1_label.set_max_width_chars (12);
face2_label = new Gtk.Label ("");
face2_label.set_markup ("<span font_desc='Inter 14'><b>Paris</b></span>");
face2_label.halign = Gtk.Align.CENTER;
face2_label.hexpand = true;
face2_label.margin_top = 6;
face2_label.set_ellipsize (END);
face2_label.set_max_width_chars (12);
face3_label = new Gtk.Label ("");
face3_label.set_markup ("<span font_desc='Inter 14'><b>London</b></span>");
face3_label.halign = Gtk.Align.CENTER;
face3_label.hexpand = true;
face3_label.margin_top = 6;
face3_label.set_ellipsize (END);
face3_label.set_max_width_chars (12);
face4_label = new Gtk.Label ("");
face4_label.set_markup ("<span font_desc='Inter 14'><b>New York</b></span>");
face4_label.halign = Gtk.Align.CENTER;
face4_label.hexpand = true;
face4_label.margin_top = 6;
face4_label.set_ellipsize (END);
face4_label.set_max_width_chars (12);
var cities_chooser = new Epoch.CitiesChooser ();
cities_chooser.city1box.changed.connect (() => {
face1_label.set_markup ("<span font_desc='Inter 14'><b>Paris</b></span>");
stdout.printf ("Signal is working correctly");
});
}
}
Приложение компилируется без каких-либо ошибок, но метки не обновляются при изменении активного элемента в выпадающем списке (city1box).
Кто-нибудь может сказать мне, как правильно обновить ярлыки?
Я думаю, что это как-то связано с сигналом
Комментарии:
1. Это не Си-код. Пожалуйста, просмотрите свои теги.
2. О, я добавил тег c, потому что vala преобразуется в c.
Ответ №1:
В каком CitiesChooser вы меняете поле со списком? Это не может быть тот же CitiesChooser, к которому вы подключаетесь, потому что это локальная переменная, и вы никогда ничего с ней не делаете. Он будет удален, когда выйдет за пределы области видимости.
Вам необходимо подключиться к сигналу CitiesChooser, который находится в вашем пользовательском интерфейсе.
Комментарии:
1. Вы имеете в виду, что я должен подключиться к сигналу CitiesChooser в самом файле CitiesChooser?
2. Я попытался это сделать, и было напечатано сообщение «Сигнал работает правильно». Но метка не была обновлена, и терминал показывал
Segmentation fault
3. Вам нужно подключиться к CitiesChooser, который находится в вашем пользовательском интерфейсе, где бы он ни находился.
4. Я сделал это, и это привело к ошибке сегментации
5. Как вы упомянули в своем anseer, я инициализирую face1_label как переменную в классе CitiesChooser, и, возможно, именно поэтому он удаляется, поскольку он не входит в область видимости.