从GTK中的G_CALLBACK返回文件名

时间:2014-04-03 12:35:52

标签: c char gtk return-value

嘿伙计,所以我想从函数(或指针)返回文件名的值,但我确定如何做到这一点。我的文件名存储文件名/ home / username / file的路径。所以这是我的主要

gchar *filename = NULL;

button = GTK_WIDGET( gtk_builder_get_object( builder, "button1" ) );
g_signal_connect (button, "clicked", G_CALLBACK (show_dialog), &filename);

显示对话框看起来像这样

static void
show_dialog ( GtkWidget *button,
          gint       response_id,
          gpointer   user_data )
/* Init filechoosedialog, builder etc */
{

gchar *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechoosedialog));

}

我是否需要将static void show_dialog更改为gchar show_dialog,最后我需要返回文件名;还有什么我需要声明,因为我得到编译错误

 warning: return makes integer from pointer without a cast 

所以我想在我的main中添加这样的代码并获取filename

的值
if filename != NULL
g_print ("Selected filename: %s\n", filename);

1 个答案:

答案 0 :(得分:1)

这听起来像是对事件驱动编程的误解。你不能在main()中做这样的事情,你在事件处理程序中这样做。在您的示例中,您可以从g_print()致电show_dialog()

如果你想做一些更复杂的事情,你需要知道一些应用程序状态:那是g_signal_connect()用户数据指针的用途。例如,如果要将文件名设置为标签的文本,则应将指向标签的指针设置为用户数据指针,然后可以在事件处理程序中设置标签文本。

更一般地说,userdata指针可以是任何东西:例如可用于存储文件名字符串的数据结构。典型用法是在main中分配的应用程序数据结构:该结构包含所有"应用程序全局"变量(如文件名)和指向结构的指针被赋予所有GTK +回调,因此所有函数都可以访问和修改结构内容。

如果问题是使用userdata指针,这里的一个例子只使用指向文件名的指针作为userdata:

g_signal_connect (button, "clicked", G_CALLBACK (button_clicked_cb), &filename);

static void
button_clicked_cb (GtkWidget *button,
                   gint       response_id,
                   gpointer   user_data)
{
    char **filename_ptr = (char**)user_data;
    *filename_ptr = g_strdup ("newly allocated string that the filename pointer in main() stack will now point to");
}