Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否在没有用户输入的情况下完成?_C_Autocomplete_Gtk - Fatal编程技术网

C 是否在没有用户输入的情况下完成?

C 是否在没有用户输入的情况下完成?,c,autocomplete,gtk,C,Autocomplete,Gtk,希望这是一个容易回答的问题!我试图使用GtkEntryCompletion(举个例子),但虽然这段代码有效,但当我以编程方式设置字段文本时,我似乎无法让GtkEntry显示自动完成结果。我试图实现的是一个半预填充文本条目,它已经向用户提供了一些自动完成选项 为了设置文本,我尝试了使用函数gtk_entry_set_text(…)、gtk_entry_buffer_insert_text(…)甚至gtk_entry_buffer_emit_insert_text(…)但没有效果。有没有一种方法可以

希望这是一个容易回答的问题!我试图使用GtkEntryCompletion(举个例子),但虽然这段代码有效,但当我以编程方式设置字段文本时,我似乎无法让GtkEntry显示自动完成结果。我试图实现的是一个半预填充文本条目,它已经向用户提供了一些自动完成选项

为了设置文本,我尝试了使用函数gtk_entry_set_text(…)、gtk_entry_buffer_insert_text(…)甚至gtk_entry_buffer_emit_insert_text(…)但没有效果。有没有一种方法可以像常规用户输入一样显示建议?

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

编辑

抱歉@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);

}

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

无骰子。我试过gtk_entry_set_text(…);然后是gtk_进入_完成_完成(…);没什么。谢谢@Mark,效果很好。不幸的是,它仍然不能按我需要的方式工作。我在弹出窗口中使用GtkEntry,由于某种原因,上面的代码不会触发它。如果我将窗口更改为顶层,它仍然可以工作。知道为什么吗?我想我可以用顶级来伪造弹出窗口,但这对我来说仍然是一个bug。