“gtk_message_dialog_set_image”已弃用

‘gtk_message_dialog_set_image’ is deprecated

我有这个代码来显示消息对话框:

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

对话框图像已弃用!

编译时,出现以下消息警告:

‘gtk_message_dialog_set_image’ is deprecated [-Wdeprecated-declarations]

我正在使用以下版本的 gcc 和 GTK:

我研究了 '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'.

有什么想法吗? 谢谢!

更新.- 感谢 Alexander Dmitriev 的建议,我编写了以下代码:

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

然而,有两个问题:

  1. 所附图片在顶部而不是中间左侧。
  2. 关闭按钮不会关闭对话框,它什么都不做。

我该如何解决这两个问题?

Use GtkDialog for dialogs with images

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() returns一个GtkBox,这样就可以使用gtk_box_pack...方法了

或者,gtk_message_dialog_get_message_area () 并在那里打包一个图标,但它是一个垂直的 GtkBox。

我终于得到了我期待的结果:

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