如何使用gtk3在GTK_DIALOG窗口中打包小部件 [英] How to pack widgets in a gtk_dialog window using gtk3
问题描述
在gtk2中,以下代码片段使用GtkDialog结构的VBox和action_Area将小部件打包到Gtk_DIALOG窗口中:
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
相矛盾如果要添加不可激活的小部件,只需将其打包到 GtkDialog结构的action_Area字段。在文档前面部分中,它在GtkDialog下声明为GtkBuilable
GtkBuildable接口的GtkDialog实现公开 Vbox和action_Area作为内部子项,名称为"Vbox"和 "ACTION_AREA"。
但我真的不知道如何使用GtkBuildable接口执行此操作,我也不想这样做。或许这正是我在gtk2中所做的,但它在gtk3中停止工作...?
我的问题是,如何将gtk2代码转换为使用gtk3,并尽可能少地进行更改。我已经找了很长时间了,但还没有找到答案。现有的gtk3文档让我不知所措。也许我只是错过了一些非常明显的东西。或者您可能不应该再这样做,而必须使用窗口而不是对话框?
感谢下面的回答,我能够将代码更改为此工作代码,它还将通过使用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_button
或gtk_dialog_add_action_widget
。
您应该使用已弃用的(!)GtkDialog仅包含私有字段,不应直接访问。
如果要添加不可激活的小部件,只需将其打包到GtkDialog结构的action_Area字段中即可。
gtk_dialog_get_action_area
获取指向action_Area的指针,但这不允许注册响应ID。
这篇关于如何使用gtk3在GTK_DIALOG窗口中打包小部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!