GTK得到多个范围值分割错误

Posted

技术标签:

【中文标题】GTK得到多个范围值分割错误【英文标题】:GTK get multiple range value segmentation error 【发布时间】:2021-12-23 10:56:24 【问题描述】:

所以,我正在尝试用 C 语言中的 gtk 创建一个 rgb 选择器。

我按照文档学习如何建立一个 glade 项目并将其与 gtk 一起使用,所以我在 glade 中制作了一个 UI,但我在 GTK 部分遇到了一些问题。我需要访问更改值信号中的多个滑块,因为我想获取它们的值来打印它们,所以我创建了一个结构来存储它们,并在信号中发送这个结构。但是我的问题是,当我尝试获取他的股票在结构中的范围的值时,我有一个分段错误,我不知道为什么。我尝试不使用结构,并且可以正确获取滑块值,但它不适用于结构。我该如何解决?

问我你是否也需要林间空地文件。

//Compil : gcc -rdynamic -o ColorPicker colorPicker.c `pkg-config --cflags --libs gtk+-3.0`
#include <gtk/gtk.h>
#include <glib/gstdio.h>
#include <gdk/gdk.h>

typedef struct

    GObject *redSlider;
    GObject *blueSlider;
    GObject *greenSlider;
    GObject *label;
Data;


static void changeLabel (GtkWidget *range, Data *data)

    gdouble red = gtk_range_get_value(GTK_RANGE(data->redSlider));
    g_print("%.0lf\n",red);
    //g_print("R : %d, G : %d, B : %d",red,green,blue);




static void activate(GtkApplication *app, gpointer user_data)


    Data *data;
    data = malloc(sizeof(*data));

    GtkBuilder *builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "colorPicker.glade",NULL);

    GObject *window = gtk_builder_get_object (builder, "window");
    gtk_window_set_application (GTK_WINDOW (window), app);


    data->redSlider = gtk_builder_get_object (builder, "redSlider");
    g_signal_connect (data->redSlider, "change-value", G_CALLBACK (changeLabel), (gpointer) data);

    data->blueSlider = gtk_builder_get_object (builder, "blueSlider");
    g_signal_connect (data->blueSlider, "change-value", G_CALLBACK (changeLabel), (gpointer) data);

    data->greenSlider = gtk_builder_get_object (builder, "greenSlider");
    g_signal_connect (data->greenSlider, "change-value", G_CALLBACK (changeLabel), (gpointer) data);

    data->label = gtk_builder_get_object (builder, "cpChooseLabel");

    /*GObject *colorBtn = gtk_builder_get_object (builder, "colorBtn");
    g_signal_connect (colorBtn, "clicked", G_CALLBACK (getColor), (gpointer) data);*/
    
    gtk_widget_show (GTK_WIDGET (window));

    /* We do not need the builder any more */
    g_object_unref (builder);
    free(data);


int main(int argc, char **argv)

#ifdef GTK_SRCDIR
    g_chdir(GTK_SRCDIR);
#endif
    GtkApplication *app = gtk_application_new("com.github.XXXXXX.rgbSelector", 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;

【问题讨论】:

【参考方案1】:

您可以在activate 的末尾通过freeing 来结束结构的生命周期。当稍后调用回调changeLabel 时,它会尝试访问不再存在的结构。如果您不关心四个指针占用的空间不能被释放,您可以删除free(data);;另一种可能性是简单地使用静态结构并传递其地址。

【讨论】:

感谢您的回复,我试图放弃免费但我继续收到分段错误。您将如何实现静态结构? 嗯——我担心如果让数据结构保持活跃仍然会留下错误,那么静态结构不会做得更好;但如果你想尝试:Data *data; data = malloc(sizeof(*data)); 变为 static Data data;data-&gt; 变为 data.(gpointer) data 变为 (gpointer)&amp;data 谢谢,我试过了,正如你之前所说的那样它不起作用,我会尝试用我发现的另一篇关于在信号中发送多个数据的帖子重新创建一个结构。谢谢大家。

以上是关于GTK得到多个范围值分割错误的主要内容,如果未能解决你的问题,请参考以下文章

xubuntu 21.10 g++ gtk4“错误:‘gtk_container_add’未在此范围内声明”

编写一个文件分割工具,能把一个大文件分割成多个小的文件。并且能再次把它们合并起来得到完整的文件。

mysql 一个字段多个值用都好分割

python获得多个输入值

使用GetElementById传递多个值(并在某个字符后分割)

从另一个表中选择多个值并放入一个由 - 分割的字符串