В gtk2 Следующий фрагмент кода работает для упаковки виджетов в окно gtk_dialog , используя vbox и action_area из GtkDialog структура:
window=gtk_dialog_new();
gtk_container_set_border_width((GtkContainer *)window, 0);
scrolled_window=gtk_scrolled_window_new(NULL,NULL);
gtk_container_set_border_width((GtkContainer *)scrolled_window, 10);
gtk_scrolled_window_set_shadow_type((GtkScrolledWindow *)scrolled_window, GTK_SHADOW_IN);
gtk_scrolled_window_set_policy((GtkScrolledWindow *)scrolled_window, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_box_pack_start((GtkBox *) (GtkDialog *)window->vbox), scrolled_window, TRUE, TRUE, 0);
gtk_widget_show(scrolled_window);
label=gtk_label_new(text);
gtk_label_set_use_markup((GtkLabel *)label, TRUE);
gtk_label_set_selectable((GtkLabel *)label, TRUE);
gtk_label_set_line_wrap((GtkLabel *)label, FALSE);
gtk_scrolled_window_add_with_viewport((GtkScrolledWindow *)scrolled_window, label);
gtk_widget_show(label);
button=gtk_button_new_with_label("close");
g_signal_connect_swapped(button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
gtk_widget_set_can_default(button, TRUE);
gtk_box_pack_start((GtkBox *) (GtkDialog *)window->action_area), button, TRUE, TRUE, 0);
gtk_widget_grab_default(button);
gtk_widget_show (button);
gtk_widget_show(window);
Однако в gtk3 этот код больше не является действительным. И это не скомпилируется.
Если я заменю экземпляры:
(GtkBox *) (GtkDialog *)window->vbox
с:
(GtkBox *) (GtkDialog *)window
И сделайте то же самое с экземплярами action_area, код скомпилируется, но в окне не будут показаны дополнительные упакованные виджеты, только те, с которыми диалоговое окно поставляется по умолчанию.
Больше информации, которая для меня немного противоречива https://developer.gnome.org/gtk3/stable/GtkDialog.html#GtkDialog-struct
GtkDialog содержит только приватные поля и не должен быть напрямую
доступ.
Но когда я читаю это на той же странице, это, кажется, противоречит предыдущей цитате https://developer.gnome.org/gtk3/stable/GtkDialog.html#gtk-dialog-add-action-widget
Если вы хотите добавить неактивируемый виджет, просто упакуйте его в
Поле action_area структуры GtkDialog.
Ранее в этом документе он указывался под GtkDialog как GtkBuildable
Реализация интерфейса GtkBuildable в GtkDialog предоставляет
vbox и action_area как внутренние потомки с именами «vbox» и
«Action_area».
Но я не знаю, как это сделать, используя интерфейс GtkBuildable , и я не хочу. Или, может быть, именно это я и сделал в gtk2, и он перестал работать в gtk3 ...?
Мой вопрос: как я могу преобразовать код gtk2 для работы с gtk3 с минимальным количеством изменений? Я долго искал, но пока не нашел ответа. Существующая документация gtk3 оставляет меня в кругу. Может быть, я просто упускаю что-то совершенно очевидное. Или, может быть, вы больше не должны это делать и должны использовать окно вместо диалога?
Благодаря приведенному ниже ответу я смог изменить код на этот рабочий, он также устранит устаревшее предупреждение о gtk_dialog_get_action_area () с помощью gtk_dialog_add_button ()
window=gtk_dialog_new();
gtk_container_set_border_width((GtkContainer *)window, 0);
scrolled_window=gtk_scrolled_window_new(NULL,NULL);
gtk_container_set_border_width((GtkContainer *)scrolled_window, 10);
gtk_scrolled_window_set_shadow_type((GtkScrolledWindow *)scrolled_window, GTK_SHADOW_IN);
gtk_scrolled_window_set_policy((GtkScrolledWindow *)scrolled_window, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_box_pack_start((GtkBox *) (GtkDialog *) (gtk_dialog_get_content_area(window)), scrolled_window, TRUE, TRUE, 0);
gtk_widget_show(scrolled_window);
label=gtk_label_new(text);
gtk_label_set_use_markup((GtkLabel *)label, TRUE);
gtk_label_set_selectable((GtkLabel *)label, TRUE);
gtk_label_set_line_wrap((GtkLabel *)label, FALSE);
gtk_container_add((GtkContainer *)scrolled_window, label);
gtk_widget_show(label);
button=gtk_dialog_add_button((GtkDialog *)window, "close", GTK_RESPONSE_CLOSE);
g_signal_connect_swapped(button, "response", (GCallback *)gtk_widget_destroy, window);
gtk_widget_set_can_default(button, TRUE);
gtk_widget_grab_default(button);
gtk_widget_show(button);
gtk_widget_show(window);
gtk_dialog_run((GtkDialog*)window);
gtk_widget_destroy(window);