没有用户输入的GtkEntryCompletion?

时间:2011-01-07 02:00:01

标签: c autocomplete gtk

希望这是一个容易回答的问题!我正在尝试使用GtkEntryCompletion(例如here)但是当这段代码工作时,我似乎无法让GtkEntry在我以编程方式设置字段文本时显示自动完成结果。我想要完成的是一个半预填充的文本条目,它已经向用户呈现了一些自动完成选项。

设置我尝试过的文本gtk_entry_set_text(...),gtk_entry_buffer_insert_text(...)甚至gtk_entry_buffer_emit_inserted_text(...),但无济于事。有没有办法以这样的方式执行此操作,以便像常规用户输入一样显示建议?

1 个答案:

答案 0 :(得分:2)

我认为您需要在设置文本后调用gtk_entry_completion_complete

修改

对不起@Tylter,但哇,这比我想象的要困难得多。我能弄清楚如何做的唯一方法是将keypress事件实际发送到窗口。

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

}

我看到的唯一问题是你必须在发送按键事件之前显示对话框窗口。