0

GTK+ では、GtkWidget -- のファイル名のテキスト エントリにアクセスできますGtkFileChooserか? を使用してテキスト入力の編集可能属性を無効にしたいgtk_entry_set_editable

4

2 に答える 2

1

私の知る限り、いいえ。

最終的に何を達成したいですか?おそらく別のアプローチがあります。

于 2012-08-27T12:35:01.477 に答える
0

GtkEntry へのポインターを取得する正当な理由がある場合は、GtkFileChooserDialog から派生します。これはおそらく GtkFileChooserDefault に変更されます。GObject は、型インスタンスをチェックするときに不正なキャストについて警告しますが、それが機能し、派生オブジェクトのデータにエラーなしでアクセスできます。警告メッセージとエントリ ポインターのローカル スタティックを回避するために、MY_FILE_CHOOSER の代わりに GTK_FILE_CHOOSER を使用します。エントリ ウィジェットは、建設中はアクセスできません。関連するコードは次のとおりです。

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

理想的ではないかもしれませんが、うまくいきます。

于 2014-09-20T09:54:01.197 に答える