【问题标题】:How to alternate light/dark rows in GtkTreeView?如何在 GtkTreeView 中交替亮/暗行?
【发布时间】:2016-06-30 08:41:57
【问题描述】:

我已阅读并尝试了此问题的现有解决方案,但我无法让它们发挥作用。我希望有人能指出我做错了什么,或者告诉我为什么这些解决方案不再起作用。

我想确保这些解决方案不起作用,所以我制作了这样的样式表:

GtkTreeView row {
    color: #FFFFFF;
    background-color: #FF0000;
}
GtkTreeView row:nth-child(even) {
    background-color: #FF00FF;
}
GtkTreeView row:nth-child(odd) {
    background-color: #00FFFF;
}

用花哨的颜色,只是为了使行颜色的差异非常明显。然后,我做了一个小应用程序来加载树视图:

#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
  int i;
  gtk_init(&argc,&argv);
  //GtkBuilder* b = gtk_builder_new_from_file("derp.glade.xml");
  GtkWidget* top = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  GtkListStore* items = gtk_list_store_new(2,
                                           G_TYPE_STRING,
                                           G_TYPE_STRING);

  GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(items));
  gtk_tree_view_insert_column_with_attributes
    (GTK_TREE_VIEW(view),
     0,
     "Herp",
     gtk_cell_renderer_text_new(),
     "text",0,
     NULL);
  gtk_tree_view_insert_column_with_attributes
    (GTK_TREE_VIEW(view),
     1,
     "Derp",
     gtk_cell_renderer_text_new(),
     "text",1,
     NULL);
  gtk_container_add(GTK_CONTAINER(top),view);
  GtkCssProvider* prov = gtk_css_provider_new();
  gtk_css_provider_load_from_path
    (prov,
    "derp.css",
     NULL);
  gtk_style_context_add_provider
    (gtk_widget_get_style_context(view),
     GTK_STYLE_PROVIDER(prov),
     GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

  GtkTreeIter iter;
  gtk_tree_model_get_iter_first(GTK_TREE_MODEL(items),&iter);

  for(i=0;i<3;++i) {
    gtk_list_store_insert_with_values
      (items,&iter,0,
       0, "Row",
       1, "Row",
       -1);
  }
  gtk_widget_show_all(top);
  gtk_main();
  return 0;
}

编译:

gcc -o test teststyle.c `pkg-config gtk+-3.0 --cflags --libs`

当我运行应用程序时,三行显示为 #00FFFF 作为背景颜色。他们不交替。它们只采用“row:nth-child(odd)”部分的颜色,甚至偶数行也采用该颜色。弄乱 css 文件也可以做一些有趣的事情。例如切换奇偶数:

GtkTreeView row {
    color: #FFFFFF;
    background-color: #FF0000;
}
GtkTreeView row:nth-child(odd) {
    background-color: #FF00FF;
}
GtkTreeView row:nth-child(even) {
    background-color: #00FFFF;
}

现在所有行都显示为#FF00FF,没有交替。我认为 GTK 完全无法以某种方式读取伪类,不小心将“GtkTreeView row:nth-child(odd)”变成了“GtkTreeView row”,并且完全错过了“nth-child(even)”选择器。如果我删除奇数选择器并且只有偶数:

GtkTreeView row {
    color: #FFFFFF;
    background-color: #FF0000;
}
GtkTreeView row:nth-child(even) {
    background-color: #FF00FF;
}

现在它的背景颜色为#FF0000,所以它完全忽略(偶数)规则。

我尝试在树视图上设置规则提示,但它没有做任何事情,除了抱怨设置规则提示已被弃用。我在基本的 Arch 系统上使用 GTK 3.18.9,XFCE 作为窗口管理器。我在这里做错什么了吗?还是我的 GTK 版本搞砸了,不知何故?

【问题讨论】:

    标签: css c gtk gtk3


    【解决方案1】:

    这可能是一个错误。在this examplerow:nth-child被应用到不同的GtkTreeView。

    【讨论】:

      【解决方案2】:

      我认为只有 2 个方块就足够了

      GtkTreeView row:nth-child(odd) {
          background-color: #FF00FF;
      }
      GtkTreeView row:nth-child(even) {
          background-color: #00FFFF;
      }
      

      下面是python中的一个例子,回答前测试没问题

      #!/usr/bin/env python3
      # -*- coding: ISO-8859-1 -*-
      import gi
      gi.require_version('Gtk', '3.0')
      from gi.repository import Gtk
      from gi.repository import Gdk
      
      window = Gtk.Window()
      window.connect("destroy", lambda q: Gtk.main_quit())
      
      liststore = Gtk.ListStore(str, int)
      liststore.append(["Oranges", 5])
      liststore.append(["Apples", 3])
      liststore.append(["Bananas", 1])
      liststore.append(["Tomatoes", 4])
      liststore.append(["Cucumber", 1])
      liststore.append(["potatoes", 10])
      liststore.append(["apricot", 100])
      
      treeview = Gtk.TreeView(model=liststore)
      treeview.set_rules_hint( True )
      window.add(treeview)
      
      treeviewcolumn = Gtk.TreeViewColumn("Item")
      treeview.append_column(treeviewcolumn)
      cellrenderertext = Gtk.CellRendererText()
      treeviewcolumn.pack_start(cellrenderertext, True)
      treeviewcolumn.add_attribute(cellrenderertext, "text", 0)
      
      treeviewcolumn = Gtk.TreeViewColumn("Quantity")
      treeview.append_column(treeviewcolumn)
      cellrenderertext = Gtk.CellRendererText()
      treeviewcolumn.pack_start(cellrenderertext, True)
      treeviewcolumn.add_attribute(cellrenderertext, "text", 1)
      css_provider = Gtk.CssProvider()
      css = """
                      /* font operate on entire GtkTreeView not for selected row */
                      GtkTreeView {font-weight: bold;font: Sans 20;font-style: italic;}
                      GtkTreeView row:nth-child(even) {
                      background-image: -gtk-gradient (linear,
                                                         left top,
                         left bottom,
                         from (#d0e4f7),
                         color-stop (0.5, darker (#d0e4f7)),
                         to (#fdffff));
                      }
                      GtkTreeView row:nth-child(odd) {
                      background-image: -gtk-gradient (linear,
                                                         left top,
                         left bottom,
                         from (yellow),
                         color-stop (0.5, darker (yellow)),
                         to (#fdffff));
                      }
                      /* next line only border action operate */
                      GtkTreeView:selected{color: white; background: green; border-width: 1px; border-color: black;}
                      /* next line for Gtk.TreeViewColumn */
                      column-header .button{color: white; background: purple;}
      
                  """
      css_provider.load_from_data(css)
      screen = Gdk.Screen.get_default()
      style_context = window.get_style_context()
      style_context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
      
      window.show_all()
      
      Gtk.main()
      

      【讨论】:

      • 代码示例不起作用“回溯(最近一次调用最后):文件“zebragtk.py”,第 58 行,在 css_provider.load_from_data(css) 类型错误:项目 0:必须是数字,而不是 str"
      • 我有点惊讶。我的 gtk 是 GtK 3.8.10 版本,python 是 2.7.6。代码运行正常。我不知道是怎么回事。有谁能解释一下吗?
      • 我正在使用 GTK 3.18.2 。听起来熟悉的 set_rules_hint 在 GTK 3.14 中被贬值了developer.gnome.org/gtk3/3.16/…
      • 花时间在 C 中实现这个:pastebin.com/wRGBxHYBgcc -o derpp `pkg-config --cflags --libs gtk+-3.0` derp.c 编译,它仍然忽略了 (even) 选择器。我有 GTK 3.18.9。不知道为什么 python 不能工作,但我怀疑严重分层的抽象接口是罪魁祸首。
      • 在 GTK# 项目中对我来说也是如此。这些行不与上述 CSS 代码交替。
      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 2017-08-24
      • 2022-10-05
      • 2017-12-27
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多