Как упаковать виджеты в окне gtk_dialog с помощью gtk3 - PullRequest
0 голосов
/ 03 мая 2018

В 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);

1 Ответ

0 голосов
/ 03 мая 2018

Для верхней части вы gtk_dialog_get_content_area. Это вернет VBox, где вы можете упаковать свои собственные виджеты.

Для нижней части вы либо gtk_dialog_add_button, либо gtk_dialog_add_action_widget.


GtkDialog содержит только приватные поля и не должен быть доступен напрямую.

Если вы хотите добавить неактивируемый виджет, просто упакуйте его в поле action_area структуры GtkDialog.

Вы должны получить указатель на action_area с устаревшим (!) gtk_dialog_get_action_area, но это не позволит зарегистрировать идентификатор ответа.

...