GtkFileChooserDialog gtk_file_chooser_get_filename()返回null,即使输入了文件名?

时间:2012-06-09 19:18:24

标签: c gtk gtk3

我正在使用C语言开发Glade3接口。

到目前为止,我有两个地方,用户选择保存文件的位置。我有一个GtkFileChooserDialog,当你点击浏览按钮时会打开它。当您单击该对话框上的“保存”时,它会填充“浏览”按钮旁边的GtkEntry。

第一次选择文件时它会起作用,但第二次gtk_file_chooser_get_filename()没有返回任何内容,即使您在对话框中输入内容也是如此。

以下是源代码的简化版本,仍有问题:http://paste.ubuntu.com/1032567/和Glade3接口文件:http://paste.ubuntu.com/1032572/

我的UI中有两个地方有这样的设置。发生在他们两个上。我有两个不同的回调函数 - 一个是较旧的尝试正确,另一个是我的最新尝试。虽然新版本避免了segfaulting,因为它检查返回的内容是否为null。

较新的回调是on_button5_clicked()和较早的on_button3_clicked

我查看了引用,即使你选择了文件名,我也没有看到为什么它会返回一个空指针。

非常感谢任何帮助。 (我觉得自己处于领先阶段)。

编辑: 所以,我还有一些想法的想法。首先,我尝试使用FileChooser小部件创建自己的窗口,而不是使用对话框。我这样做是为了确保对话框没有运行gtk_Dialog_Run调用没有问题。我还尝试重复获取的代码并检查以查看指向文件名字符串的指针是否为空。当它在同一个回调调用中第二次运行时,它返回一个非空字符串指针。我也这样做是为了确保它与启动对话框的窗口(实际上,gtk_widget_show()ED)本身就是一个对话框的事实无关。

我尝试了我的理论,我必须将对话框中的按钮设置为gtk.RESPONSE_OK或gtk_RESPONSE_CANCEL响应。这似乎没有任何影响。

3 个答案:

答案 0 :(得分:0)

请注意评论(这些是大约56到72行):

if (widgets != NULL)
{
fprintf(stderr, "widgets is not null\n");
gchar * filename = gtk_file_chooser_get_filename(widgets->zssvpth_FileChooser);

if (filename != NULL)
{
     fprintf(stderr, "filename is not null\n");
 gtk_entry_set_text(widgets->zssvpth_Entry, g_filename_to_utf8(filename,  strlen(filename), NULL, NULL, NULL));

    /* ERROR code below will never be called since filename 
    must be NULL to get here */ 

    if (filename = NULL)
       {
   fprintf(stderr, "Filename is null");
   }
else
   {
   // g_free(filename);
   }
  /* END OF ERROR */

    }
else
{
    fprintf(stderr, "filename is NULL\n");
}
gtk_widget_hide(GTK_WIDGET(widgets->zssvpth_FileChooser));

g_free(filename); // this might be a better place for this call

 }
else
 {
  fprintf(stderr, "widgets is a null pointer!\n");
 }

这可能有助于追踪错误......

答案 1 :(得分:0)

似乎调用gtk_file_chooser_get_filename()将在第二次隐藏并显示小部件时返回​​null,除非您调用gtk_file_chooser_set_filename()

我在文档中没有看到任何关于此的内容,但大多数时候,在显示之前设置文件名是有意义的,因为无论你是获取 ting文件名都可能有已被更改,因此无论如何更新文件选择器都是有意义的。

答案 2 :(得分:0)

应该是:

if(filename == NULL)

if(filename = NULL)

否则您将其设置为NULL。