0

我正在使用 C 语言开发 Glade3 界面。

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

它在您第一次选择文件时起作用,但第二次gtk_file_chooser_get_filename(),即使您在对话框中输入了某些内容,它也不返回任何内容。

这是源代码的简化版本,仍然存在问题:http ://paste.ubuntu.com/1032567/和与之配套的 Glade3 接口文件:http: //paste.ubuntu.com/1032572/

我的 UI 中有两个地方有这样的设置。发生在他们俩身上。我有两个不同的回调函数——一个是旧的尝试,另一个是我最近的尝试。两者都不起作用,尽管较新的版本避免了段错误,因为它会检查返回的内容是否为空。

较新的回调是on_button5_clicked()和较旧的on_button3_clicked.

我查看了参考资料,但我没有看到任何关于为什么它会返回空指针,即使您选择了文件名。

任何帮助将不胜感激。(我觉得我正处于头撞阶段)。

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

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

4

3 回答 3

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");
 }

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

于 2012-06-09T19:50:36.403 回答
0

它应该是:

如果(文件名 == NULL)

不是:

如果(文件名 = NULL)

否则,您将其设置为 NULL。

于 2013-03-17T03:05:51.957 回答
0

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

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

于 2012-07-18T04:31:04.030 回答