似乎GtkDialog会自动将焦点设置在最左侧的按钮上(在我的情况下是“取消”)。 我想将此默认焦点更改为另一个按钮,但我无法使用“gtk_dialog_set_default_response”的路径,因为我已将这些按钮手动打包到对话框操作区域中。
然后,在上下搜索API文档时,我意识到GtkDialog是GtkWindow的后代,因此尝试了“gtk_window_set_default”,它首先给了我某种“断言`gtk_widget_get_can_default(default_widget)'失败”的警告。为了遵守,我在按钮上使用了“gtk_widget_set_can_default”,警告消失了。但是:“取消”按钮仍然设置了焦点。
除了必须使用“gtk_dialog_add_action_widget”之外,真的没办法吗?
答案 0 :(得分: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;
}
希望这有帮助!