嘿伙计,所以我想从函数(或指针)返回文件名的值,但我确定如何做到这一点。我的文件名存储文件名/ 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);
答案 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");
}