c - 如何使用 gtk3 在 gtk_dialog 窗口中打包小部件

标签 c gtk3 gtk2

gtk2 中,以下代码片段使用 vboxaction_area 将小部件打包到 gtk_dialog 窗口中> 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

The GtkDialog contains only private fields and should not be directly accessed.

但是当我在同一页上阅读这篇文章时,它似乎与之前的引用相矛盾 https://developer.gnome.org/gtk3/stable/GtkDialog.html#gtk-dialog-add-action-widget

If you want to add a non-activatable widget, simply pack it into the action_area field of the GtkDialog struct.

在该文档的前面,它在 GtkDialog as GtkBuildable

下声明

The GtkDialog implementation of the GtkBuildable interface exposes the vbox and action_area as internal children with the names “vbox” and “action_area”.

但我真的不知道如何使用 GtkBuildable 接口(interface) 来做到这一点,我也不想这样做。或者也许这正是我在 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


The GtkDialog contains only private fields and should not be directly accessed.

If you want to add a non-activatable widget, simply pack it into the action_area field of the GtkDialog struct.

您应该使用已弃用的 (!)gtk_dialog_get_action_area 获取指向 action_area 的指针,但这将不允许注册响应 ID。

关于c - 如何使用 gtk3 在 gtk_dialog 窗口中打包小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50146147/

相关文章:

c - 是否有标准宏来检测需要对齐内存访问的架构?

C-转换类型字符 '0' 和 '[' 格式 [-Wformat=] 且参数过多

python - 如何使按钮图像拉伸(stretch)、透明、宽度高度完全缩放适合?

gtk - 加载我的 xfce 插件时出现严重错误 : Not enough arguments are passed to the wrapper,

c - gtk2中的gtk_idle_add()和gtk_main_context_invoke()有什么区别?

c - 函数中结构指针的范围

c++ - MailSlot写发送同样的东西三次C/C++

c - 如果使用 Glade,GtkDrawingArea 在绘制时不会更新

c - 当我按下按钮时,如何取消选中 GTK 中的复选框?

c - 如何仅使用 GTK3、C 和 Cairo 制作基本动画