Обновите Gtk.Метка при изменении активного элемента в Gtk.ComboBox

#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, и, возможно, именно поэтому он удаляется, поскольку он не входит в область видимости.