«gtk_message_dialog_set_image» устарела - PullRequest
0 голосов
/ 06 января 2020

У меня есть этот код для отображения диалогового окна сообщения:

void mensajeVentana (GtkWidget *wid, GtkWidget *win, gchar *mensaje) {
  GtkWidget *dialog = NULL;
  GtkWidget *image;

  dialog = gtk_message_dialog_new(GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, mensaje);

  image = gtk_image_new_from_icon_name ("computer-fail", GTK_ICON_SIZE_DIALOG);
  gtk_widget_show (image);
  gtk_message_dialog_set_image(GTK_MESSAGE_DIALOG(dialog), image);

  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
  gtk_dialog_run (GTK_DIALOG (dialog));
  gtk_widget_destroy (dialog);
}

Диалоговое окно Изображение устарело! Dialog box deprecated

При компиляции у меня появляется следующее сообщение с предупреждением:

‘gtk_message_dialog_set_image’ is deprecated [-Wdeprecated-declarations]

Я использую следующие версии g cc и GTK:

  • g cc версия 8.3.0 (Debian 8.3.0-6)
  • GTK3, libgtk-3-0: amd64 3.24.5-1

Я исследовал вопрос о замене 'gtk_message_dialog_set_image', единственной помощью, которую я нашел, была документация, которая гласит:

gtk_message_dialog_get_image has been deprecated since version 3.12 and should not be used in newly-written code.
Use GtkDialog for dialogs with images
Gets the dialog’s image.

Но кроме этого я не нашел ни одного примера о том, как отобразить значок с диалоговым окном сообщения с использованием GTK3 без функции: 'gtk_message_dialog_set_image'.

Есть идеи? Спасибо!

ОБНОВЛЕНИЕ. Я написал следующий код благодаря предложениям Александра Дмитриева:

void mensajeVentana (GtkWidget *wid, GtkWidget *win, gchar *mensaje) {

  GtkWidget *dialog = NULL;
  GtkWidget *image, *content_area, *box, *label;

  dialog = gtk_dialog_new_with_buttons ("Alerta",
                                      GTK_WINDOW(win),
                                      GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
                                      "Cerrar",
                                      GTK_BUTTONS_CLOSE,
                                      NULL);

  content_area = gtk_dialog_get_content_area (dialog);
  box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
  label = gtk_label_new (mensaje);

  image = gtk_image_new();
  gtk_image_set_from_icon_name (image, "computer-fail", GTK_ICON_SIZE_DIALOG);
  gtk_widget_show (image);

  gtk_box_pack_start (box, image, TRUE, TRUE, 1);
  gtk_container_add (content_area, box);
  gtk_container_add (content_area, label);
  gtk_widget_show_all (dialog);
}

enter image description here

Тем не менее, есть две проблемы:

  1. Прикрепленное изображение вверху, а не в центре слева.
  2. Кнопка закрытия не закрывает диалоговое окно, ничего не делает.

Как я могу решить эти две проблемы?

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Я наконец получил ожидаемые результаты:

void mensajeVentana (GtkWidget *wid, GtkWidget *win, gchar *mensaje) {

  GtkWidget *dialog = NULL;
  GtkWidget *image, *content_area, *box, *label;

  dialog = gtk_dialog_new_with_buttons ("Alerta",
                                      GTK_WINDOW(win),
                                      GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
                                      "Cerrar",
                                      GTK_BUTTONS_CLOSE,
                                      NULL);

  content_area = gtk_dialog_get_content_area (GTK_DIALOG(dialog));
  box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
  label = gtk_label_new (mensaje);

  image = gtk_image_new();
  gtk_image_set_from_icon_name (GTK_IMAGE(image), "computer-fail", GTK_ICON_SIZE_DIALOG);
  gtk_widget_show (image);
  gtk_widget_set_halign (image, GTK_ALIGN_START);

  g_signal_connect_swapped (dialog,
                           "response",
                           G_CALLBACK (gtk_widget_destroy),
                           dialog);

  gtk_box_pack_start (GTK_BOX(box), image, TRUE, TRUE, 10);
  gtk_box_pack_start (GTK_BOX(box), label, TRUE, TRUE, 10);
  gtk_container_add (GTK_CONTAINER(content_area), box);

  gtk_widget_show_all (dialog);
}

enter image description here

1 голос
/ 07 января 2020

Используйте GtkDialog для диалогов с изображениями

Разработчики GTK хотят, чтобы диалоги сообщений были только текстовыми. Если вам нужен диалог сообщений со значком, они заставляют вас делать это вручную:

GtkWidget *dialog, *content_area, *box, *image;
dialog = gtk_dialog_new_with_buttons () // create dialog
content_area = gtk_dialog_get_content_area (dialog) // get a container to place your own widgets
// make a GtkGrid or GtkBox, pack it there and manually with GtkImage and GtkLabel
box = gtk_box_new (...)
image = gtk_image_new (...)
gtk_box_pack... (box, image)
gtk_container_add (content_area, box) // see note below

gtk_dialog_get_content_area() возвращает GtkBox, таким образом, вы можете использовать gtk_box_pack... методы для это.

В качестве альтернативы, gtk_message_dialog_get_message_area () и упакуйте туда иконку, но это вертикальный GtkBox.

...