2011-01-07 2 views
2

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

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

ответ

2

Мне кажется, вам нужно позвонить gtk_entry_completion_complete после установки текста.

EDIT

К сожалению @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); 

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

} 

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

+0

Нет кубиков. Я попробовал gtk_entry_set_text (...); затем gtk_entry_completion_complete (...); и ничего. – Tyler

+0

@ Тайлер, см. Правки. – Mark

+0

Спасибо @Mark, который отлично работает. К сожалению, он все равно не будет работать так, как мне нужно. Я использую GtkEntry во всплывающем окне, и по какой-то причине вышеуказанный код не вызывает его. Если я изменил окно на TopLevel, он работает. Любая идея, почему это так? Полагаю, я мог бы подделывать всплывающее окно с использованием верхнего уровня, но это все еще кажется ошибкой для меня. – Tyler

Смежные вопросы