如何访问GtkFileChooser中的文本条目

如何访问GtkFileChooser中的文本条目,gtk,Gtk,在GTK+中,是否可以访问GtkFileChooser中文件名的GtkWidget--文本条目?我想使用gtk\u entry\u set\u editable禁用文本条目的可编辑属性,据我所知,没有 你最终想要实现什么?也许还有另一种方法。如果有正当理由获取指向GtkEntry的指针,那么从GtkFileChooserDialog派生,它可能会变异为GtkFileChooserDefault。GObject在检查类型实例时会抱怨非法强制转换,即使它可以工作并且派生对象的数据可以无错误地访问,请

在GTK+中,是否可以访问
GtkFileChooser
中文件名的GtkWidget--文本条目?我想使用
gtk\u entry\u set\u editable

禁用文本条目的可编辑属性,据我所知,没有


你最终想要实现什么?也许还有另一种方法。

如果有正当理由获取指向GtkEntry的指针,那么从GtkFileChooserDialog派生,它可能会变异为GtkFileChooserDefault。GObject在检查类型实例时会抱怨非法强制转换,即使它可以工作并且派生对象的数据可以无错误地访问,请使用GTK_FILE_选择器而不是MY_FILE_选择器,以避免警告消息和入口指针的本地静态。在构造期间无法访问条目小部件。以下是相关代码:

static GtkEntry *chooser_entry;

static void my_file_chooser_finalize (GObject *object)
{
  chooser_entry = NULL;
  (G_OBJECT_CLASS (my_file_chooser_parent_class))->finalize (object);
}

static void my_file_chooser_init (MyFileChooser *self)
{
  chooser_entry = NULL;
}

static void look_for_entry(GtkWidget *widget, void *self)
{
  if (GTK_IS_ENTRY(widget)) {
    chooser_entry = (GtkEntry*)widget;
  }
  else if (GTK_IS_CONTAINER(widget)) {
    gtk_container_forall ( GTK_CONTAINER (widget), look_for_entry, self);
  }
}

static void file_chooser_find_entry (GtkWidget *chooser)
{
  GList *children, *iter;

  /* Get all objects inside the dialog */
  children = gtk_container_get_children (GTK_CONTAINER (chooser));

  for (iter = children; iter; iter = iter->next) {

    if (GTK_IS_CONTAINER(iter->data)) {

      gtk_container_forall ( GTK_CONTAINER (iter->data), look_for_entry, chooser);

      if (chooser_entry != NULL) {
        break;
      }
    }
  }
  g_list_free (children);
}

GtkEntry *my_file_chooser_get_entry (GtkWidget *widget)
{
  if (chooser_entry == NULL) {
    file_chooser_find_entry (widget);
  }
  return chooser_entry;
}

char *my_file_chooser_get_entry_text(GtkWidget *widget)
{
  char       *text;
  GtkEntry   *entry;

  text = NULL;

  if (GTK_IS_FILE_CHOOSER(widget)) {

    entry = my_file_chooser_get_entry(widget);

    if (GTK_IS_ENTRY(entry)) {

      if (gtk_entry_get_text_length (entry)) {
        text = g_strdup (gtk_entry_get_text(entry));
      }
    }
  }
  return text;
}

可能不太理想,但有效。

我的目的是检查文本条目中指定的文件是否存在。例如,条目中相关的文件名是qqaa,用户无法更改(这就是为什么我要设置“可编辑”属性)。当用户按下OK按钮时,它将检查路径中是否存在qqaa。如果是,请继续;否则,发出警告并留在文件选择器中。只需将文件选择器设置为选择文件夹而不是文件。谢谢。将文件选择器设置为选择文件夹,然后检查文件夹中是否存在相关文件。对我来说,这确实是另一种方法。