LINUX.ORG.RU

Показ текста при нажатии на кнопку GTK+, c

 ,


0

1

Как при нажатии на кнопку показать текст на той же форме, где и кнопка?

#include <gtk/gtk.h>

GtkWidget *window = NULL;
GtkWidget *v_box = NULL;

void
show_text(void)
{
    GtkWidget *label = NULL;

    label = gtk_label_new("hello, some");
    gtk_box_pack_start(GTK_BOX(v_box), label, FALSE, FALSE, 0);

    return;
}

int
main(int argc, char **argv)
{
    GtkWidget *button = NULL;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window), 500, 500);
    gtk_window_set_title(GTK_WINDOW(window), "Something");

    v_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);

    button = gtk_button_new();
    gtk_button_set_label(GTK_BUTTON(button), "show");
    gtk_box_pack_start(GTK_BOX(v_box), button, FALSE, FALSE, 0);
    g_signal_connect(button, "clicked", G_CALLBACK(show_text), NULL);

    gtk_container_add(GTK_CONTAINER(window), v_box);

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

    return 0;
}

так не работает

помогите, пожалуйста



Последнее исправление: cherry (всего исправлений: 1)

У тебя показывается все виджеты окна в запуске программы. Когда нажимаешь кнопку, код выполняется, но виджет нужно показать, так как он создается после команды gtk_widget_show_all .

Так что допиши в show_text, widget_show ( label ).

Ну или если не получится, вынеси label в глобальную область видимости.

u0atgKIRznY5
()
Ответ на: комментарий от cherry

при нажатии на кнопку предыдущий текст не исчезает, как предыдущий текст удалять?

Если Вы добавили widget_show(label) в тело show_text(), то у Вас при каждом нажатии на кнопку создаётся новый label и добавляется на форму. Нужно либо удалять предыдущий, либо сделать label глобальным, вызов gtk_label_new() перенести в main() и менять только текст set_label()...

backbone ★★★★★
()
Последнее исправление: backbone (всего исправлений: 1)
Ответ на: комментарий от backbone

второй вариант работает, но как удалять в первом случае? ?

cherry
() автор топика

Выше ответили на конкретный вопрос, но используй GtkBuilder.

https://developer.gnome.org/gtk3/stable/ch01s04.html

Файлы для него умеет генерировать Glade.

И без надобности не создавай новые компоненты на лету, просто пусть они будут созданы сразу - но невидимы.

И еще - https://www.gtkmm.org/

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 3)
Ответ на: комментарий от cherry

devhelp тебе в помощь. Там все функции написаны, убедись что документация gtk установлена.

В глобальной области указатель label создаешь. В main создаешь gtk_label_new.

В функции смены текста используй gtk_label_set_text.

u0atgKIRznY5
()
Ответ на: комментарий от u0atgKIRznY5

В глобальной области указатель label создаешь

не учи ребенка плохому. указатель спокойно передается через user_data

ananas ★★★★★
()
Ответ на: комментарий от ananas

не учи ребенка плохому. указатель спокойно передается через user_data

Ты видел? У него функция не принимает параметров. void show_text ( void ).

u0atgKIRznY5
()

Помоему это ваша функция

void
gtk_label_set_text (GtkLabel *label,
                    const gchar *str);
Естественно надо изменить вашу функцию show_text хотябы вот так
void show_text(void){
if(label==NULL){
label = gtk_label_new("hello, some");
    gtk_box_pack_start(GTK_BOX(v_box), label, FALSE, FALSE, 0);
}else
gtk_label_set_text(label,"same text");
return;
}
label в данном случае будет global, что бы этого избежать надо передать указатель на label в функцию последним аргументом g_connect_signal и переписать вашу функцию

Silerus ★★★★
()
Ответ на: комментарий от u0atgKIRznY5

ты ему devhelp ведь уже посоветовал. а там прототипы колбеков вполне нормально описаны

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.