在gtk2中,以下代码片段使用gtk dialog结构的vbox和action区域将小部件打包到gtk_对话框窗口中:

  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只包含私有字段,不应直接
已访问。
但当我在同一页上读到这篇文章时,它似乎与前面的引用相矛盾
如果要添加不可激活的小部件,只需将其打包到
GtkDialog结构的action_area字段。
在该文档的前面,它在GtkDialog下声明为GtkBuildable
GtkBuildable接口的GtkDialog实现公开了
vbox和action\u区域作为名为“vbox”和
“行动区”。
但我不知道如何使用GtkBuildable接口来实现这一点,我也不想这样做。或许这正是我在gtk2中所做的,它在gtk3中停止工作。。。?
我的问题是如何将gtk2代码转换为与gtk3一起工作,并且尽可能少地进行更改。我已经找了好一阵子了,但还没有找到答案。现有的GTK3文档让我陷入了圈套。也许我只是错过了一些很明显的东西。或者你不应该再这样做了,而应该使用窗口而不是对话框?
由于下面的答案,我能够将代码更改为这个工作的代码,它还将通过使用gtk_dialog_add_button()消除关于gtk_dialog_get_action_area()的不推荐的警告
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);

最佳答案

对于顶部部分,您可以gtk_dialog_get_content_area。这将返回一个VBox,您可以在其中打包自己的小部件。
对于底部部分,您可以gtk_dialog_add_buttongtk_dialog_add_action_widget
GtkDialog只包含私有字段,不应直接访问。
如果要添加不可激活的小部件,只需将其打包到GtkDialog结构的action_area字段中。
您应该获得一个指向操作区的指针,该指针不推荐使用(!)gtk_dialog_get_action_area,但这将不允许注册响应id。

07-24 09:45