为什么我的GTK +信号回调中出现分段错误? [英] Why do I get a segmentation fault in my GTK+ signal callback?

查看:164
本文介绍了为什么我的GTK +信号回调中出现分段错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  #include< gtk / gtk.h>我们正在测量一个GTK标签的大小: 

static void map_event(GtkWidget * window,gpointer lab){
g_print(In the callback..\\\
);
GtkWidget * label = GTK_WIDGET(lab);
g_print(一切正常......);


static void activate(GtkApplication * app,gpointer user_data)
{
GtkWidget * window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window),Window1);
gtk_window_set_default_size(GTK_WINDOW(window),200,280);
GtkWidget * grid = gtk_grid_new();
gtk_container_add(GTK_CONTAINER(window),grid);
GtkWidget * label = gtk_label_new(Hello world!);
gtk_grid_attach(GTK_GRID(grid),label,0,0,1,1);
g_signal_connect(window,map-event,G_CALLBACK(map_event),label);
gtk_widget_show_all(window);


int main(int argc,char ** argv){
GtkApplication * app = gtk_application_new(
org.gtk.example,G_APPLICATION_FLAGS_NONE);
g_signal_connect(app,activate,G_CALLBACK(activate),NULL);
int status = g_application_run(G_APPLICATION(app),argc,argv);
g_object_unref(app);

返回状态;
}

这给出了输出:

 在回调中。
分段错误(核心转储)

如果我注释掉该行:

  GtkWidget * label = GTK_WIDGET(lab); 

没有分段错误,标签出现并且输出为:

 在回调中.. 
一切正常..

我在这里错过了什么?

解决方案

map-event 有以下签名,因此您缺少 GdkEvent * 参数:

  gboolean 
user_function(GtkWidget * widget,
GdkEvent * event,
gpointer user_data)



<不幸的是,GTK +是用C语言编写的,所以它没有类型安全的回调函数,所以很容易出现这样的错误。


I am trying to measure the size of a GTK label:

#include <gtk/gtk.h>

static void map_event(GtkWidget *window, gpointer lab) {
    g_print( "In the callback..\n" );
    GtkWidget *label = GTK_WIDGET(lab);
    g_print( "Everything is ok..\n" );
}

static void activate (GtkApplication* app, gpointer user_data)
{
    GtkWidget *window = gtk_application_window_new (app);
    gtk_window_set_title (GTK_WINDOW (window), "Window1");
    gtk_window_set_default_size (GTK_WINDOW (window), 200, 280);
    GtkWidget *grid = gtk_grid_new ();
    gtk_container_add (GTK_CONTAINER (window), grid);
    GtkWidget *label = gtk_label_new("Hello world!");
    gtk_grid_attach(GTK_GRID (grid), label, 0,0,1,1);
    g_signal_connect (window, "map-event", G_CALLBACK(map_event), label);
    gtk_widget_show_all (window);
}

int main (int argc, char **argv) {
    GtkApplication *app = gtk_application_new (
        "org.gtk.example", G_APPLICATION_FLAGS_NONE );
    g_signal_connect( app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref (app);

    return status;
}

This gives output:

In the callback..
Segmentation fault (core dumped)

If I comment out the line:

GtkWidget *label = GTK_WIDGET(lab);

there is no segmentation fault, the label shows up and the output is:

In the callback..
Everything is ok..

What am I missing here?

解决方案

map-event has following signature, so you are missing GdkEvent* argument:

gboolean
user_function (GtkWidget *widget,
               GdkEvent  *event,
               gpointer   user_data)

Unfortunately, GTK+ is written in C, so it lacks type-safe callback functions, so it's easy to make mistakes such as this.

这篇关于为什么我的GTK +信号回调中出现分段错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆