[英]Adding image backgroud to gtk 3 window hiding widgets and layouts
我創建了具有多個布局的 GTK 3 窗口,每個布局都包含一些位於主布局之上的小部件。 現在我嘗試將圖像背景添加到窗口。 但是該圖像隱藏了主布局中存在的所有其他布局和小部件。
我在 GTK 2 中測試了相同的代碼,它按預期工作。 (ie) 子布局和小部件顯示在像素圖的頂部。
這是我嘗試過的代碼。
GtkWidget*
create_wndmain (void)
{
GtkWidget *wndmain;
GtkWidget *lytmain;
GtkWidget *lytpreview;
GtkWidget *txtpreview;
GtkWidget *lytutils;
GtkWidget *txtutils;
GtkWidget *lytfsys;
GtkWidget *txtfsys;
GtkWidget *pixmap;
wndmain = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (wndmain), _("Window"));
gtk_window_set_position (GTK_WINDOW (wndmain), GTK_WIN_POS_CENTER);
gtk_window_set_default_size (GTK_WINDOW (wndmain), 1024, 720);
lytmain = gtk_layout_new (NULL, NULL);
gtk_widget_show (lytmain);
gtk_container_add (GTK_CONTAINER (wndmain), lytmain);
pixmap = gtk_image_new_from_file("pixmaps/layout-1920x1080.png");
gtk_container_add (GTK_CONTAINER (lytmain), pixmap);
gtk_widget_show (pixmap);
lytpreview = gtk_layout_new (NULL, NULL);
gtk_widget_show (lytpreview);
gtk_layout_put (GTK_LAYOUT (lytmain), lytpreview, 848, 88);
gtk_widget_set_size_request (lytpreview, 168, 480);
gtk_layout_set_size (GTK_LAYOUT (lytpreview), 400, 400);
pixmap = gtk_image_new_from_file("pixmaps/layout-1920x1080.png");
gtk_container_add (GTK_CONTAINER (lytpreview), pixmap);
gtk_widget_show (pixmap);
txtpreview = gtk_text_view_new ();
gtk_widget_show (txtpreview);
gtk_layout_put (GTK_LAYOUT (lytpreview), txtpreview, 8, 376);
gtk_widget_set_size_request (txtpreview, 144, 80);
gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (txtpreview)), _("\n\n Preview Area"), -1);
lytutils = gtk_layout_new (NULL, NULL);
gtk_widget_show (lytutils);
gtk_layout_put (GTK_LAYOUT (lytmain), lytutils, 664, 8);
gtk_widget_set_size_request (lytutils, 344, 72);
gtk_layout_set_size (GTK_LAYOUT (lytutils), 400, 400);
txtutils = gtk_text_view_new ();
gtk_widget_show (txtutils);
gtk_layout_put (GTK_LAYOUT (lytutils), txtutils, 16, 8);
gtk_widget_set_size_request (txtutils, 312, 56);
gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (txtutils)), _("\n \tUtility Area"), -1);
lytfsys = gtk_layout_new (NULL, NULL);
gtk_widget_show (lytfsys);
gtk_layout_put (GTK_LAYOUT (lytmain), lytfsys, 8, 88);
gtk_widget_set_size_request (lytfsys, 192, 480);
gtk_layout_set_size (GTK_LAYOUT (lytfsys), 400, 400);
txtfsys = gtk_text_view_new ();
gtk_widget_show (txtfsys);
gtk_layout_put (GTK_LAYOUT (lytfsys), txtfsys, 32, 72);
gtk_widget_set_size_request (txtfsys, 128, 328);
gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (txtfsys)), _("\n\n\n File system Area"), -1);
return wndmain;
}
int
main (int argc, char *argv[])
{
GtkWidget *wndmain;
gtk_init (&argc, &argv);
wndmain = create_wndmain ();
gtk_widget_show (wndmain);
gtk_main ();
return 0;
}
似乎 GTK3 的理念是將更多的小部件尺寸/圖像/顯示功能轉向使用 CSS。 考慮到這一點,我采用了您的程序並將 CSS 提供程序小部件添加到您的程序中。
GtkCssProvider *provider;
provider = gtk_css_provider_new();
然后我停用了將像素圖像放置在窗口內的部分。
//pixmap = gtk_image_new_from_file("pixmaps/layout-1920x1080.png");
//gtk_container_add (GTK_CONTAINER (lytmain), pixmap);
//gtk_widget_show (pixmap);
然后在定義了窗口小部件之后,我為提供程序定義了 CSS 樣式信息,然后將提供程序與窗口小部件相關聯。
gtk_css_provider_load_from_data(provider, "window.background {background-image: url(\"/home/craig/images/aaa 1335.jpg\") }", -1, NULL);
gtk_style_context_add_provider(gtk_widget_get_style_context(wndmain), GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
程序構建完成后,窗口中就會出現各種小部件。
因此,您可能不得不更多地利用 CSS 提供程序來復制 GTK2 中的后台行為。
希望有幫助。
問候。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.