GTK4 设置 GtkInfoBar背景颜色

Posted 从善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GTK4 设置 GtkInfoBar背景颜色相关的知识,希望对你有一定的参考价值。

GTK4 设置 GtkInfoBar背景颜色

一、失败的尝试

最近使用GTK4开发应用,发现使用CSS无法改变GtkInfoBar的背景颜色,查看了源码中GtkInfoBar的CSS层级,如下:

/**************
 * GtkInfoBar *
 **************/
infobar {
  > revealer > box {
    padding: 8px;
    border-spacing: 12px;
  }

  &.action:hover > revealer > box {
      background-color: if($variant == 'light', desaturate(lighten(invert($selected_bg_color), 47%), 30%),
                        desaturate(darken(invert($selected_bg_color), 42%), 70%));
  }

  &.info,
  &.question,
  &.warning,
  &.error {
    > revealer > box {
      border-bottom: 1px solid lighten($borders_color, 5%);
      background-color: if($variant == 'light', desaturate(lighten(invert($selected_bg_color), 45%), 30%),
                        desaturate(darken(invert($selected_bg_color), 40%), 70%));
    }
  }
}

在GTK4 code中创建 CssProvider给GtkInfoBar添加 Style Context,如下:

......
const char* css="infobar.info > revealer > box {background:#F00;}";

GtkCssProvider *cssProvider = gtk_css_provider_new();
gtk_css_provider_load_from_data(cssProvider,css,-1);
        
GtkWidget *bar = gtk_info_bar_new ();
gtk_style_context_add_provider(gtk_widget_get_style_context(bar),
                               GTK_STYLE_PROVIDER(cssProvider),
                               GTK_STYLE_PROVIDER_PRIORITY_USER);
gtk_box_append (GTK_BOX (vbox), bar); //vbox是window的child
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_INFO);
GtkWidget *label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_INFO");
gtk_info_bar_add_child (GTK_INFO_BAR (bar), label);
......

结果如下图:

使用GtkInspector查看 发现GtkInfoBar的CSS修改无效:

有知道怎么修改的同学一定要告诉我,我是一个CSS小白
有知道怎么修改的同学一定要告诉我,我是一个CSS小白
有知道怎么修改的同学一定要告诉我,我是一个CSS小白

二、换个思路

2.1 使用 GtkMessageType “GTK_MESSAGE_OTHER”来实现需求

我们发现GTK4 只对 info、warning、error、question设置了CSS,没有对other设置CSS,

所以我们可以通过设置 infobar的背景颜色来实现需求(其它消息类型即使设置了 infobar的背景颜色也会被它的子控件覆盖),如下code

......
const char* css="infobar {background:#F00;}";

GtkCssProvider *cssProvider = gtk_css_provider_new();
gtk_css_provider_load_from_data(cssProvider,css,-1);
        
GtkWidget *bar = gtk_info_bar_new ();
gtk_style_context_add_provider(gtk_widget_get_style_context(bar),
                               GTK_STYLE_PROVIDER(cssProvider),
                               GTK_STYLE_PROVIDER_PRIORITY_USER);
gtk_box_append (GTK_BOX (vbox), bar); //vbox是window的child
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_OTHER);
GtkWidget *label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_INFO");
gtk_info_bar_add_child (GTK_INFO_BAR (bar), label);
......

结果如下图:

2.2 任意GtkMessageType 下获取 infobar的孙子控件box设置CSS

通过源码或者 GtkInspector可以清晰的看到InfoBar层级关系为:

GtkInfoBar–>GtkRevealer–>GtkBox

那么我们可以直接获取box控件设置其背景颜色,如下:

......
const char* css="box{background:#F00;}";

GtkCssProvider *cssProvider = gtk_css_provider_new();
gtk_css_provider_load_from_data(cssProvider,css,-1);
        
GtkWidget *bar = gtk_info_bar_new ();
GtkWidget *bar_reveal_box = gtk_widget_get_first_child(gtk_widget_get_first_child(bar));
gtk_style_context_add_provider(gtk_widget_get_style_context(bar_reveal_box),
                               GTK_STYLE_PROVIDER(cssProvider),
                               GTK_STYLE_PROVIDER_PRIORITY_USER);
gtk_box_append (GTK_BOX (vbox), bar); //vbox是window的child
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_INFO);
GtkWidget *label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_INFO");
gtk_info_bar_add_child (GTK_INFO_BAR (bar), label);
......

效果如下图:

GtkInspector截图如下:

这种方式感觉不够专业,还是希望有知道怎么通过CSS直接修改的小伙伴告诉我

我是一个CSS小白
我是一个CSS小白
我是一个CSS小白


以上是关于GTK4 设置 GtkInfoBar背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

MFC的CListControl列表怎么实现拖动鼠标左键选取一片表格?并改变表格背景颜色

怎么设置Visual Studio代码窗口背景颜色

怎么设置Visual Studio代码窗口背景颜色

怎么设置Visual Studio代码窗口背景颜色

怎么设置Android Studio代码字体及背景颜色

怎么设置Visual Studio代码窗口背景颜色