我正在学习GTK +,这个简单的应用程序每次运行时都会崩溃。
它在主窗口中创建一个标签,每次单击一个按钮(key_press_event
)时,标签和标题都应该交换。
如果我在gtk_label_set_text
函数中注释掉change_title
,则标题会正确切换,应用程序不会崩溃。为什么gtk_label_set_text
会导致我的应用崩溃?
#include <gtk/gtk.h>
#include <string.h>
const gchar first[]="FIRST";
const gchar last[]="LAST";
static void destroy(GtkWidget *window,gpointer data)
{
gtk_main_quit();
}
static gboolean change_title(GtkWidget *widget,GtkLabel *data)
{
if(strcmp(last,gtk_window_get_title(GTK_WINDOW(widget)))){
gtk_window_set_title(GTK_WINDOW(widget),last);
gtk_label_set_text(data,first);
} else {
gtk_window_set_title(GTK_WINDOW(widget),first);
gtk_label_set_text(data,last);
}
return FALSE;
}
int main(int argc,char **argv)
{
GtkWidget *window, *label;
gtk_init(&argc,&argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),last);
gtk_widget_set_size_request(window,300,100);
g_signal_connect(window,"destroy_event",G_CALLBACK(destroy),NULL);
label = gtk_label_new("caasdasdjadnjadjahadjad");
gtk_container_add(GTK_CONTAINER(window),label);
g_signal_connect(window,"key_press_event",G_CALLBACK(change_title),GTK_LABEL(label));
gtk_widget_show_all(window);
gtk_main();
return 0;
}
编辑:我发现使用GDB时出现问题,标签指针未正确传递给change_title
函数。我不知道为什么。 (例如:main()
label = 0xb6406608
,change_title()
label = 0x807bda8
)
答案 0 :(得分:2)
在key_press_event
上进行简单的Google搜索之后,我看到该事件的回调在窗口小部件和用户数据指针之间有另一个参数。原型是:
gboolean key_event_handler(GtkWidget *widget,GdkEventKey *event, gpointer data);
如此简单地将您的功能更改为:
static gboolean change_title(GtkWidget *widget, GdkEventKey *event, GtkLabel *data)
它应该有用。
答案 1 :(得分:1)
您的change_title
函数原型错误。
请参阅the documentation了解正确的原型。大多数*-event
信号将实际事件作为处理函数中的参数传递,因为处理程序通常需要检查事件才能执行。例如,此处GdkEventKey
事件将包含有关按下(或释放)了哪个键的信息。