GTK4 设置 GtkInfoBar背景颜色_从善若水的博客-程序员宅基地

技术标签: css  c语言  gtk/gtk+  GTK  

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小白


在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_31985307/article/details/119965477

智能推荐

zcmu1374: Greatest Naruto Army(递归)_1374 greatest naruto army-程序员宅基地

题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1374题目大意忍者影分身。忍者有n点脉轮,当脉轮数量超过1的时候可以进行影分身,制造幻象,并且分他ai点脉轮,剩下bi点脉轮,同时主体疲劳值增加|ai-bi|,幻象和主体还能继续影分身,直到脉轮数等于1。问在幻象最多的情况下使得疲劳值最小,求这个最小疲劳值。范围:(0 < N < 1e7)思路dfs递归求解。首先他一共有n-1个幻象这个毋庸置疑,那么现在就要降低疲_1374 greatest naruto army

【搬迁】N久之前,安卓开发的百度一面,二面,三面和CVTE一面(2016年秋招)_merryzoe-程序员宅基地

CVTE一面图片缓存你如何去设计 LRU算法原理 了解过View的绘制 了解过事件分发 多线程有使用吗 线程池有使用吗 java虚拟机内存管理有哪些? 堆跟栈的区别 hashmap和hashtable的区别?hashmap中如何解决冲突?hashmap只有链表去解决冲突?hashmap如何计算hash值? 线程有几种状态,怎么去停止一个线程 sleep和wait的区别 设..._merryzoe

【新阁教育】S7.NET+Log4Net+SQLSugar+MySQL搭建Iot平台_log4net sqlsugar-程序员宅基地

1、搭建西门子S7仿真环境基于PLCSIM-Advanced搭建西门子S7仿真环境注意事项:1、通过公众号后台发送PLCSIM-Advanced获取软件2、安装软件要先安装WinPcap软件3、安装WinPcap可能会出现下面的问题解决方案是右击WinPcap属性,设置兼容性和管理员权限4、使用过程参考下方链接基于S7-PLCSIM Advanced搭建S7通信仿真环境2、搭建MySQL数据库环境【MySQL环境】虚拟机或Windows系统部署过程严格按照下._log4net sqlsugar

记录在宝塔面板运行python过程_宝塔运行python项目-程序员宅基地

一、基本环境搭建服务器:阿里云 => 云服务器ECS服务器系统:centOSpython版本:python3.8python框架:flask可视化面板:宝塔面板二、搭建简单介绍1、安装python2、在python项目管理器安装完毕后点击设置进入设置面板,而后点击版本管理安装python3、点击添加python项目,弹出弹窗,按照提示填入即可4、使用宝塔面板终端测试python文件,步骤为:cd命令进入python文件夹下,而后使用命令python3 文件名.py 运行p_宝塔运行python项目

MySQL中设置create_time和update_time默认值并实时更新_mysql createtime default_桐花思雨的博客-程序员宅基地

目录前言通过建表语句来指定通过 `navicat` 的可视化界面直接操作前言mysql 数据库有时候会给表中加上 create_time 和 update_time 这两个字段,这两个字段可以设置为 datetime 或 timestamp 类型,那么如何为其设置默认值并根据当前时间来更新呢?如何做到通过 mysql 数据库的设置来实现上述字段的自动化填充呢,而不用在 sql 语句中手动来填充呢。解决办法如下通过建表语句来指定CREATE TABLE `test` ( `text` var_mysql createtime default

OpenWrt学习笔记6 -- 开发package-程序员宅基地

终于要开始写代码了,好激动。 在一个典型的package目录下,你会看到三个东西: package/Makefile package/patches目录,可选 package/files目录,可选 patches目录顾名思..._openwrt package

随便推点

vim配置--命令行简单(文章最后)-程序员宅基地

花了很长时间整理的,感觉用起来很方便,共享一下。我的vim配置主要有以下优点:1.按F5可以直接编译并执行C、C++、java代码以及执行shell脚本,按“F8”可进行C、C++代码的调试2.自动插入文件头 ,新建C、C++源文件时自动插入表头:包括文件名、作者、联系方式、建立时间等,读者可根据需求自行更改3.映射“Ctrl + A”为全选并复制快捷键,方便复制代码4.按“F

matplotlib及pandas使用总结-程序员宅基地

1.import matplotlib.pyplot as pltimport seaborn as sns画子图: plt.subplot(m,n) (m,n)个子图fig,(ax1,ax2)=plt.subplot(1,2,1):第一个子图子图设置标题:ax1.set_title(name)matplotlib画子图时设置总标题:fig.suptitle(name)...

git 学习-程序员宅基地

今天来看看git对象数据库(object database)的相关内容:1 首先要弄明白什么是object database,我们先建一个git仓库.#mkdir test#cd test#git init#vim file.txt//在文件中输入Hi, zhm #git add file.txt#git comm

提取MAC地址OUI对应的厂商信息-程序员宅基地

为什么80%的码农都做不了架构师?>>> ..._官方iee的oui文件

flink-sql读写hive-1.14_flink 创建hive表_第一片心意的博客-程序员宅基地

本文是对 flink 1.14 官网中读写 hive 部分内容的翻译整理。_flink 创建hive表

Hard-题目49:273. Integer to English Words-程序员宅基地

题目原文: Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than 231 - 1.For example, 123 -> “One Hundred Twenty Three” 12345 -> “Twelve Thousand T

推荐文章

热门文章

相关标签