GTK: установить кнопку по умолчанию для диалога - PullRequest
4 голосов
/ 04 января 2012

Кажется, что GtkDialog автоматически устанавливает фокус на самой левой кнопке (в моем случае это «Отмена»).Я хочу изменить этот фокус по умолчанию на другую кнопку, но я не могу идти по пути "gtk_dialog_set_default_response", потому что я упаковал кнопки вручную в область действия диалогов.

Затем, при поиске документа API вверх и внизЯ понял, что GtkDialog является потомком GtkWindow, и, таким образом, попробовал «gtk_window_set_default», которое сначала дало мне своего рода предупреждение «assertion` gtk_widget_get_can_default (default_widget) «fail».Чтобы соответствовать, я использовал «gtk_widget_set_can_default» на кнопке, и предупреждение исчезло. НО: фокус все еще устанавливается на кнопке «Отмена».

Действительно ли нет другого способа, кроме необходимости использовать »gtk_dialog_add_action_widget "?

1 Ответ

3 голосов
/ 04 января 2012

Просто используйте gtk_widget_grab_focus на виджете, на котором вы хотите сфокусироваться. Виджет должен быть фокусируемым , что является истинным по умолчанию в случае кнопки. Вот пример кода для вашей справки:

#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;
}

Надеюсь, это поможет!

...