Задать свойство потомка контейнера GTK - PullRequest
0 голосов
/ 10 октября 2019

Я хочу изменить заголовок элемента переключателя стека.

Вот фрагмент из структуры GUI:

<child>
          <object class="GtkStack" id="stack1">
            <property name="width_request">100</property>
            <property name="height_request">80</property>
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkFixed" id="f1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
              </object>
              <packing>
                <property name="name">page2</property>
                <property name="title" translatable="yes">c</property>
              </packing>
            </child>
            <child>
              <object class="GtkFixed" id="f2">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
              </object>
              <packing>
                <property name="name">page1</property>

И это код:

GtkWidget       *window;
GtkWidget       *fixed1;
GtkBuilder      *builder;
GtkAdjustment   *adjustment1;
GtkWidget       *b1;
GtkWidget       *b2;
GtkWidget       *b3;
GtkWidget       *b4;
GtkWidget       *f1;
GtkWidget       *f2;
GtkWidget       *f3;
GtkWidget       *f4;
GtkWidget       *stack1;
GtkWidget       *stkSw;

int display = 4;

int main(int argc, char *argv[]) {
        gtk_init(&argc, &argv); // init Gtk

//---------------------------------------------------------------------
// establish contact with xml code used to adjust widget settings
//---------------------------------------------------------------------

        builder = gtk_builder_new_from_file ("scroll.glade");

        window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
        fixed1 = GTK_WIDGET(gtk_builder_get_object(builder, "fixed1"));

        b1 = GTK_WIDGET(gtk_builder_get_object(builder, "b1"));
        b2 = GTK_WIDGET(gtk_builder_get_object(builder, "b2"));
        b3 = GTK_WIDGET(gtk_builder_get_object(builder, "b3"));
        b4 = GTK_WIDGET(gtk_builder_get_object(builder, "b4"));
        f1 = GTK_WIDGET(gtk_builder_get_object(builder, "f1"));
        f2 = GTK_WIDGET(gtk_builder_get_object(builder, "f2"));
        f3 = GTK_WIDGET(gtk_builder_get_object(builder, "f3"));
        f4 = GTK_WIDGET(gtk_builder_get_object(builder, "f4"));
        stack1 = GTK_WIDGET(gtk_builder_get_object(builder, "stack1"));
        stkSw = GTK_WIDGET(gtk_builder_get_object(builder, "stkSw"));



        g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

        gtk_builder_connect_signals(builder, NULL);

        gtk_container_child_set_property (GTK_CONTAINER(stack1), f1, (const gchar*) "title", (const GValue*) "IVALUE");

        gtk_widget_show(window);

        gtk_main();

        return EXIT_SUCCESS;
}

Вставка этой строки приводит к ошибке сегментации:

        gtk_container_child_set_property (GTK_CONTAINER(stack1), f1, (const gchar*) "title", (const GValue*) "IVALUE");

Я написал эту строку в соответствии с документом: https://developer.gnome.org/gtk3/stable/GtkContainer.html#gtk-container-child-set-property

Разве я не установил свойство в соответствии свыше ссылка? Или есть ошибка где-то еще в моем коде?

1 Ответ

1 голос
/ 11 октября 2019

Чтобы сделать GValue, вы не можете просто сделать:

(const GValue*) "IVALUE"

Вы должны инициировать GValue, установить строку, а затем вы можете передать ее. Наконец, вы должны сбросить (освободить) GValue.

GValue a = G_VALUE_INIT;
g_value_init (&a, G_TYPE_STRING);
g_value_set_string (&a, "IVALUE");

gtk_container_child_set_property (GTK_CONTAINER(stack1), f1, (const gchar*) "title", &a);

g_value_unset (&a);

Прочтите здесь для получения дополнительной информации и большего количества примеров: https://developer.gnome.org/gobject/stable/gobject-Generic-values.html

...