簡體   English   中英

將圖像背景添加到 gtk 3 窗口隱藏小部件和布局

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM