передача аргумента / аргумента сигнала обратному вызову на GTK + в C - PullRequest
2 голосов
/ 31 января 2011

Вот мой код:

#include <gtk/gtk.h>

G_MODULE_EXPORT void waka(GtkWidget *button, GtkWidget* entry1)
{
printf("%s",gtk_entry_get_text(GTK_ENTRY(entry1)));
}

int main(int argc, char * argv[])
{

GtkWidget *window, *button, *entry;

gtk_init(&argc,&argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

button = gtk_button_new_with_label("hha");
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(waka),entry);

entry = gtk_entry_new();

GtkWidget *vbox;

vbox = gtk_vbox_new(FALSE,2);

gtk_box_pack_start_defaults(GTK_BOX(vbox),button);
gtk_box_pack_start_defaults(GTK_BOX(vbox),entry);

gtk_container_add(GTK_CONTAINER(window),vbox);


gtk_widget_show_all(window);
gtk_main();


return 0;
}

Когда я запускаю его и пытаюсь заполнить какую-то строку в поле ввода, а затем нажимаю кнопку, он говорит «ошибка сегментации». Что происходит?

Кроме того, обратный вызов работает только с одним аргументом пользовательских данных. Как насчет того, чтобы получить два или более аргумента, что я должен делать в функции обратного вызова и при вызове g_signal_connect()?

1 Ответ

4 голосов
/ 01 февраля 2011

проблема в том, что вы пытаетесь использовать указатель на запись до его инициализации.Я немного изменил ваш код, чтобы исправить это, посмотрите, будет ли он работать для вас:

#include <gtk/gtk.h>

void waka(GtkWidget *button, GtkWidget* entry1)
{
 g_print("entry: %s\n", gtk_entry_get_text(GTK_ENTRY(entry1)));
}

int main(int argc, char * argv[])
{
 GtkWidget *window, *button, *entry, *vbox;

 gtk_init(&argc, &argv);

 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 button = gtk_button_new_with_label("hha");
 entry = gtk_entry_new();
 vbox = gtk_vbox_new(FALSE, 2);

 gtk_box_pack_start_defaults(GTK_BOX(vbox),button);
 gtk_box_pack_start_defaults(GTK_BOX(vbox),entry);

 gtk_container_add(GTK_CONTAINER(window),vbox);

 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(waka), entry);

 gtk_widget_show_all(window);
 gtk_main();

 return 0;
}

надеюсь, это поможет, с уважением

...