2012-01-04 7 views
3

GtkDialogが一番左のボタン(私の場合は「キャンセル」)に自動的にフォーカスを設定しているようです。 このデフォルトのフォーカスを別のボタンに変更したいのですが、ボタンを手動でダイアログアクションエリアにパックしているので、 "gtk_dialog_set_default_response"のルートに行くことはできません。上下APIドキュメントを検索しながらGTK:ダイアログの既定のボタンを設定します

が、私はGtkDialog最初は私のいくつかの並べ替えたのGtkWindowの子孫、ひいてはしようとした「gtk_window_set_default」、であることに気づき、「`gtk_widget_get_can_default(default_widget)アサーションを」失敗しました」警告。これを遵守するために、私はボタンに "gtk_widget_set_can_default"を使用し、警告は消えました。しかし、フォーカスはまだ "キャンセル"ボタンに設定されています。

「gtk_dialog_add_action_widget」を使用する以外の方法はありませんか?

答えて

3

フォーカスを当てたいウィジェットでgtk_widget_grab_focusを使用してください。ウィジェットは、のフォーカスがあるでなければなりません。これは、ボタンの場合はデフォルトでtrueです。参考用のサンプルコードは次のとおりです。

#include <gtk/gtk.h> 

/* Uncomment the below macro to see the default focus */ 
//#define DEFAULT_FOCUS 

int main(void) 
{ 
    gtk_init (NULL, NULL); 
#ifdef DIALOG_WITH_BUTTONS 
    GtkWidget * dialog = gtk_dialog_new_with_buttons ("Dialog", 
        NULL, 
        GTK_DIALOG_MODAL, 
        GTK_STOCK_CANCEL, 
        GTK_RESPONSE_CANCEL, 
        GTK_STOCK_OK, 
        GTK_RESPONSE_OK, 
        NULL); 
#ifndef DEFAULT_FOCUS 
    gtk_widget_grab_focus(gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK)); 
#endif 

#else 
    GtkWidget *dialog = gtk_dialog_new(); 
    gtk_window_set_title(GTK_WINDOW(dialog), "Dialog"); 
    GtkWidget *action_area = gtk_dialog_get_action_area(GTK_DIALOG(dialog)); 
    GtkWidget *ok_button = gtk_button_new_with_label("OK"); 
    GtkWidget *cancel_button = gtk_button_new_with_label("Cancel"); 
    gtk_container_add(GTK_CONTAINER(action_area), cancel_button); 
    gtk_container_add(GTK_CONTAINER(action_area), ok_button); 
    gtk_widget_show_all(dialog); 
#ifndef DEFAULT_FOCUS 
    gtk_widget_grab_focus(ok_button); 
#endif 

#endif 
    g_signal_connect(dialog, "destroy", G_CALLBACK(gtk_main_quit), NULL); 
    gtk_dialog_run(GTK_DIALOG(dialog)); 
    gtk_main(); 
    return 0; 
} 

+0

はい!ありがとう、これは絶対に私が探していたものでしたが、あなたはその大きな例を書く必要はありませんでした;)私はgtk_window_set_defaultを使った私の最初の試みがうまくいかなかった理由はまだ疑問です。 – Ancurio

+1

フォーカスウィジェットがある場合、デフォルトのウィジェットはフォーカスを受け取らないように見えるからです。 'gtk_window_set_default'を動作させるには、ウィジェットがデフォルト(あなたが行った)とウィンドウのフォーカスを' NULL'に設定できることを確認してください。したがって、上記のコードでは、 'gtk_widget_grab_focus(ok_button);'は 'gtk_window_set_focus(GTK_WINDOW(dialog)、NULL)に置き換えることができます。 gtk_widget_set_can_default(ok_button、TRUE); gtk_window_set_default(GTK_WINDOW(ダイアログ)、ok_button); ' –

関連する問題