GtkEntryCompletion без ввода пользователя? - PullRequest
2 голосов
/ 07 января 2011

Надеюсь, это простой вопрос!Я пытаюсь использовать GtkEntryCompletion (в качестве примера здесь ), но пока этот код работает, я не могу заставить GtkEntry представлять результаты автозаполнения, когда я устанавливаю текст поля программно.Я пытаюсь выполнить полузаполненную текстовую запись, которая уже предоставляет пользователю некоторые опции автозаполнения.

Чтобы установить текст, я попытался использовать функции gtk_entry_set_text (...), gtk_entry_buffer_insert_text (...) и даже gtk_entry_buffer_emit_inserted_text (...), но безрезультатно.Есть ли способ сделать это таким образом, чтобы вести себя как обычный пользовательский ввод и отображать предложения?

1 Ответ

2 голосов
/ 07 января 2011

Я думаю, вам нужно позвонить gtk_entry_completion_complete после установки текста.

РЕДАКТИРОВАТЬ

Извините @Tylter, но это таксложнее, чем я предполагал.Единственный способ выяснить, как это сделать - это отправить событие нажатия клавиши в окно.

  gtk_widget_grab_focus(entry);

  GdkEvent new_event;
  new_event.key.type = GDK_KEY_PRESS;
  new_event.key.window = gtk_widget_get_parent_window(entry);
  new_event.key.send_event = TRUE;
  new_event.key.time = GDK_CURRENT_TIME;
  new_event.key.keyval = 0x053; // capital S
  new_event.key.state = GDK_KEY_PRESS_MASK;
  new_event.key.length = 0;
  new_event.key.string = 0;
  new_event.key.hardware_keycode = 0;
  new_event.key.group = 0;

  gdk_event_put((gpointer)&new_event);

РЕДАКТИРОВАТЬ 2

Используете ли вы GtkDialogдля вашего всплывающего окна?Я написал это очень быстро, и это похоже на работу.Здесь вы будете создавать диалог в событии нажатия кнопки:

static void click_event( GtkWidget *widget,
                     gpointer   data )
{
   GtkWidget* window = gtk_dialog_new ();
   completion = create_completion();
   entry = gtk_entry_new();
   gtk_entry_set_completion(GTK_ENTRY(entry), completion);
   // add entry to dialog
   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
                        entry, TRUE, TRUE, 0);

   gtk_widget_show(entry);    
   gtk_widget_show(window);  // you must show the window before sending the keypress event

   gtk_widget_grab_focus(entry);

   GdkEvent new_event;
   new_event.key.type = GDK_KEY_PRESS;
   new_event.key.window = gtk_widget_get_parent_window(entry);
   new_event.key.send_event = TRUE;
   new_event.key.time = GDK_CURRENT_TIME;
   new_event.key.keyval = 0x053; // capital S
   new_event.key.state = GDK_KEY_PRESS_MASK;
   new_event.key.length = 0;
   new_event.key.string = 0;
   new_event.key.hardware_keycode = 0;
   new_event.key.group = 0;

   gdk_event_put((gpointer)&new_event);

}

Единственное, что я понял, это то, что вы должны показать диалоговое окно перед отправкой события нажатия клавиши.

...