2

我想要一个带有背景图像的 GTK TreeView,如下面的模型所示。

我找到了设置小部件背景颜色的方法,但似乎没有设置背景pixbuf或其他图像格式的方法。

我将 Python 与 PyGTK 一起使用,但任何具有 GTK 绑定的语言的答案都是可以接受的。

带有背景图像的 gtkTreeView 样机

带有背景图像的 GTK TreeView 样机

第一次尝试

根据 Jong Bor 的建议,我尝试了以下方法:

style = treeview.get_style().copy()
img_pixbuf = gtk.gdk.pixbuf_new_from_file(image_filename)
img_pixmap = img_pixbuf.render_pixmap_and_mask()[0]
for state in (gtk.STATE_NORMAL, gtk.STATE_ACTIVE, gtk.STATE_PRELIGHT,
              gtk.STATE_SELECTED, gtk.STATE_INSENSITIVE):
    style.bg_pixmap[state] = img_pixmap
treeview.set_style(style)

起初这似乎没有任何效果,但在我选择一个项目时,我TreeView观察到以下内容:

显示部分背景图像的选定行

选择一行时,部分背景会“显示出来”。

(请注意,我使用的是基于我的模型的背景图像,除了它有一些蓝色,用于测试目的)。

然后我激活了我的 GUI 的一部分,它清除了 TreeView 的内容并重新绘制它,并观察到这一点:

平铺背景可见

但是,一旦我向 TreeView 添加了一些东西,背景就会消失,所以我仍然不确定这是否朝着正确的方向发展。

4

2 回答 2

0

我怀疑由于每个单元格都有一个控制其外观的渲染器,因此您必须以某种方式逐个修改树视图单元格。

无论如何,以下代码可能值得一试(未经测试,不完整的代码):

# Get the treeview's style
style = treeview.get_style().copy()

# Change the bg_pixmap attribute
#   It's an array with one pixbuf for every widget state, so
#   you probably want to replace each of the default 
#   pixmap's with your own image(s)
#   

style.bg_pixmap[0] = your_pixmap
style.bg_pixmap[1] = your_pixmap
style.bg_pixmap[2] = your_pixmap
style.bg_pixmap[3] = your_pixmap
style.bg_pixmap[4] = your_pixmap

# Set the modified style
treeview.set_style(style)

bg_pixmap 属性记录在PyGTK 参考中

我不确定数组位置如何映射到小部件状态。如果它与 c++ 中的相同,它将是:

0 - STATE_NORMAL    
1 - STATE_ACTIVE    
2 - STATE_PRELIGHT  
3 - STATE_SELECTED  
4 - STATE_INSENSITIVE   
于 2011-03-21T21:48:58.373 回答
0

使用 GTK3 和 gtkmm 可以使用 CSS,但图像需要作为文件或资源可用。

在这里,我假设树视图是子类的:

class MyTreeView : public Gtk::TreeView { .. };

为您的树视图设置一个名称,然后为其添加一个 CSS 样式:

MyTreeView::MyTreeView () {

  set_name ("MyTreeView");
  auto css = Gtk::CssProvider::create ();
  auto sc  = get_style_context ();

  string path_to_img = "my-image.png";

  string css_data =
    ustring::compose (
                    "#MyTreeView  { background-image: url(\"%1\");"
                    "               background-repeat: no-repeat;"
                    "               background-position: 50%% 50%%;"
                    " }\n"
                    "#MyTreeView  .hide_bg { background-image: none; }",
                    path_to_img);

  try {
    css->load_from_data (css_data);
  } catch (Gtk::CssProviderError &e) {
    cout "error: attempted to set background image: " << path_to_img.c_str () << ": " << e.what () << endl;
  }

  auto screen = Gdk::Screen::get_default ();
  sc->add_provider_for_screen (screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

}

似乎也可以通过添加将的背景设置为透明:

background: none;

到 CSS。

然后可以使用以下方法隐藏或显示背景图像:

if (!hide) {
  auto sc = get_style_context ();
  if (!sc->has_class ("hide_bg")) sc->add_class ("hide_bg");
} else {
  auto sc = get_style_context ();
  if (sc->has_class ("hide_bg")) sc->remove_class ("hide_bg");
}

在此处输入图像描述

于 2015-12-24T11:17:12.527 回答