2011-01-07 11 views
2

うまくいけば、これは簡単に答えることができます。私はGtkEntryCompletion(例では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); 

} 

唯一の落とし穴は、あなたが、KeyPressイベントを送信する前にダイアログウィンドウを表示しなければならないということです。

+0

ダイスはありません。私はgtk_entry_set_text(...)を試みました。それに続くgtk_entry_completion_complete(...);何もない。 – Tyler

+0

@Tyler、編集を参照してください。 – Mark

+0

ありがとう@マークは素晴らしい作品です。残念ながら、私はそれが動作するために必要な方法ではありません。私はポップアップウィンドウでGtkEntryを使用していますが、何らかの理由で上記のコードがそれをトリガーしません。私がTopLevelにウインドウを変更すると、それは動作します。それがどんなアイデアなのか?私はトップレベルを使ってポップアップを偽造することができると思うが、これはまだ私のバグのようだ。 – Tyler

関連する問題