gtkmm给组件添加css

news2025/1/22 19:07:49

设置方式

使用CSS分为两步,1:为组件设这css名称,2:加载样式表。

样式表我们写在文件中就行(似乎也可以从字符串加载,不过不推荐)。

1. 设置css名称

  1. 使用gtk的接口:gtk_widget_class_set_css_name()
    • 这个接口用来给GType类型设置样式表,gtkmm中还没有封装C++的版本,比较难用,主要用于自定义组件。不是刚需,用后面的方法更简单。
  2. Gtk::Widget::set_name()(对应于gtk_widget_set_name()
    • 设置组件ID,给ID选择器用的。
  3. Gtk::Widget::add_css_cladd()(对应于gtk_widget_class_set_css_name()
    • 设置组件类名,给类选择器用的。

gtk_widget_class_set_css_name()需要自定义类来使用,比较复杂,暂时不用。

2. 添加样式表文件

添加样式表需要使用Gkt::CssProvider这个类,将它作为类的成员。

4.9之前:

m_refCssProvider = Gtk::CssProvider::create();

Gtk::StyleContext::add_provider_for_display (
	get_display(),
	m_refCssProvider,
	GTK_STYLE_PROVIDER_PRIORITY_APPLICATION
);

m_refCssProvider->load_from_path ("custom_gtkmm.css");

这里就能加载样式表类。
不过实际中样式表可能出错,为了方便发现错误,我们需要处理parsing_error信号,打印错误位置和文件:

{
...
m_refCssProvider->signal_parsing_error().connect (
	    sigc::mem_fun (*this, &YouClas::on_parsing_error));
...
}

void YourClass::on_parsing_error (const Glib::RefPtr<const Gtk::CssSection> &section,
                                      const Glib::Error &error)
{
	std::cerr << "on_parsing_error(): " << error.what() << std::endl;
	if (section) {
		const auto file = section->get_file();
		if (file) {
			std::cerr << "  URI = " << file->get_uri() << std::endl;
		}
		
		auto start_location = section->get_start_location();
		auto end_location = section->get_end_location();
		std::cerr << "  start_line = " << start_location.get_lines() + 1
		          << ", end_line = " << end_location.get_lines() + 1 << std::endl;
		std::cerr << "  start_position = " << start_location.get_line_chars()
		          << ", end_position = " << end_location.get_line_chars() << std::endl;
	}
}

4.10开始,已经将Gtk::StyleContext::add_provider_for_display()改为Gtk::StyleProvider::add_provider_for_display ()。只用把前缀换一下就OK了。

可以用GTK_CHECK_VERSION宏来判断版本,来进行条件编译,例如:

GTKMM_CHECK_VERSION(4,9,1) // 具体用法自己看文档。

例子

用只有一个按钮的界面为例,

在这里插入图片描述
样式文件:custom.css,正常状态为蓝色,悬停变红色,点击变绿色。

button#mybutton{
    background-image: none;
    background-color: blue;
}

button#mybutton:hover{
    background-color: red;
}

button#mybutton:active{
    background-color: green;
}

重点来了,

  1. get_css_name()方法可以获取组件的css名,是组件名,相当于html中的标签名。
  2. 其中button就是Gtk::Button的组件名,相当于html的标签名。
  3. mybuttonset_name()方法添加的id。这里用的交集选择器。
  4. 按钮比较特殊,需要设置background-image: none才能看到background-color的效果,因为主题会给GtkButton设置背景图片。而且,按钮是一个容器,里面其实有一个GtkLabel,你可以用自选择器选中里面的GtkLabelGtk::Label)。

类选择器一样的,add_css_class_name()设置就OK。

样式的设置记住以下方法就OK了:

  1. gtk_widget_class_set_css_name()
  2. Gtk::Widget.set_name()
  3. Gtk::Widget.add_css_class_name()
  4. Gtk::Widget.get_css_name()

加载样式表:

  1. Gtk::CssProvider::create()
  2. Gtk::StyleContext::add_provider_for_display()Gtk::StyleProvider::add_provider_for_display()
  3. Gtk::CssProvider.load_from_path()
  4. Gtk::CssProvider.signal_parsing_error()

代码

demo.h

#pragma once

#include <gtkmm.h>

class Demo : public Gtk::Window {
public:
	Demo();
private:
	void on_parsing_error (const Glib::RefPtr<const Gtk::CssSection> &section,
	    const Glib::Error &error);
	    
	Gtk::Button m_button;
	Glib::RefPtr<Gtk::CssProvider>m_refCssProvider;
};

demo.cpp

#include "demo.h"
#include<iostream>


Demo::Demo() :
	m_button ("this my button")
{
	//加载CSS文件
	m_refCssProvider = Gtk::CssProvider::create();
	Gtk::StyleContext::add_provider_for_display (
	    get_display(),
	    m_refCssProvider,
	    GTK_STYLE_PROVIDER_PRIORITY_APPLICATION
	);
	m_refCssProvider->signal_parsing_error().connect (
	    sigc::mem_fun (*this, &Demo::on_parsing_error)
	);
	m_refCssProvider->load_from_path ("custom.css");
	//CSS设置
	m_button.set_name ("mybutton");
	
	/*打印结果是button*/
	// std::cout << m_button.get_css_name() << std::endl;
	this->set_child (m_button);
}

void
Demo::on_parsing_error (const Glib::RefPtr <const Gtk::CssSection> &section,
                        const Glib::Error &error)
{
	std::cerr << "on_parsing_error(): " << error.what() << std::endl;
	if (section) {
		const auto file = section->get_file();
		if (file) {
			std::cerr << "  URI = " << file->get_uri() << std::endl;
		}
		
		auto start_location = section->get_start_location();
		auto end_location = section->get_end_location();
		std::cerr << "  start_line = " << start_location.get_lines() + 1
		          << ", end_line = " << end_location.get_lines() + 1 << std::endl;
		std::cerr << "  start_position = " << start_location.get_line_chars()
		          << ", end_position = " << end_location.get_line_chars() << std::endl;
	}
}

main.cpp

#include "demo.h"
#include <gtkmm/application.h>


int main (int argc, char **argv)
{
	auto app = Gtk::Application::create();
	
	return app->make_window_and_run <Demo> (argc, argv);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rk3568点亮E-ink

rk3568 Android11/12 适配 E-ink “EINK”是英语ElectronicInk的缩写。翻译成中文为“电子墨水”。电子墨水由数百万个微胶囊(Microcapsules)所构成&#xff0c;微胶囊的大小约等同于人类头发的直径。每个微胶囊里含有电泳粒子──带负电荷的白色以及带正电荷的黑色粒子&#…

Ubuntu 交叉编译Windows 版本的ffmpeg最佳实践

之前介绍在Windows上采用msys2+minGW或者cygwin在Windows编译方法。很多读者觉得在Windows搭建一个类Linux比较麻烦或者说方法不够通用,本文就介绍在流行的Linux发行版Ubuntu上编译window版本的ffmpeg。即介绍一种通用办法来编译Windows版本ffmpeg,该方法可以推广到android,…

算法 贪心4 || 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

860.柠檬水找零 很简单的一题&#xff0c;完全是常识题 class Solution { public:bool lemonadeChange(vector<int>& bills) {unordered_map<int,int> map;for(int i 0; i < bills.size(); i){map[bills[i]];if(bills[i] ! 5){if(map[5] 0) return fals…

【Linux】程序中获取和设置cpu和mem相关信息

这里是目录一、CPU和MEM信息1.1、CPU信息1.1.1、CPU核心数1.1.2、CPU频率读取和调整1.1.3、CPU温度1.2、MEM信息二、C程序读取CPU和MEM信息三、测试写在前面&#xff1a; 记录一下日常&#xff0c;之前有做过相关工作&#xff0c;但是没有记录下来&#xff0c;因此写一写文章。…

使用hbuilder连接夜神模拟器调试app

1. Hbuilder设置 这里端口号随便用一个没有被占用的&#xff1b; 路径夜神模拟器的安装路径下的nox_adb.exe的路径。 2. 夜神模拟器设置 设置如下&#xff1a; 工具&#xff0c;设置&#xff0c;关于平板电脑&#xff08;这里应该没有开发者模式选项&#xff0c;这是我配好之…

【LeetCode】剑指 Offer 53. 在排序数组中查找数字 p263 -- Java Version

1. 题目介绍&#xff08;53. 在排序数组中查找数字&#xff09; 面试题53&#xff1a;在排序数组中查找数字 一共分为三小题&#xff1a; 题目一&#xff1a;数字在排序数组中出现的次数题目二&#xff1a;0 ~ n-1 中缺失的数字题目三&#xff1a;数组中数值和下标相等的元素 2…

【创作赢红包】面向对象基础概念

什么是面向对象 面向对象&#xff08;Object Oriented&#xff09;是软件开发方法&#xff0c;一种编程范式&#xff0c;它是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段后的产物。 早期的计算机编程是基于面向过程的方法&#xff0c;如实现算…

前端工程化:环境准备—NodeJs安装-Vue项目开发流程

一、前端工程化-Yapi 介绍&#xff1a;YApi 是高效、易用、功能强大的 api 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务 地址&#xff1a; http://yapi.smart-xwork.cn/ 具体操作步骤&#xff1a; 1、添加项目 2、添加接口&#xff1a;根据ID查…

技术分享 | observer 资源水位介绍

作者&#xff1a;郭斌斌 爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 OceanBase 集群界面会展示 Observer …

MATLAB绘制柱状/饼图填充图

MATLAB绘制柱状填充图方法1&#xff1a;hatchfill2工具1.1 案例1&#xff1a;柱状图填充1.2 案例2&#xff1a;饼图填充方法2&#xff1a;applyhatch函数2.1 案例1&#xff1a;柱状图填充2.2 案例2&#xff1a;饼图填充方法3&#xff1a; applyhatch_plusC函数3.1 案例1&#x…

Python 小型项目大全 31~35

三十一、猜数字 原文&#xff1a;http://inventwithpython.com/bigbookpython/project31.html 猜数字是初学者练习基本编程技术的经典游戏。在这个游戏中&#xff0c;电脑会想到一个介于 1 到 100 之间的随机数。玩家有 10 次机会猜出数字。每次猜中后&#xff0c;电脑会告诉玩…

Java实现ArrayList和底层源码讲解

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Centos7安装MySQL5.7.30

文章目录1. 环境准备1.1 卸载mariadb1.2 下载MySQL 5.7.301.3 安装MySQL依赖项1.4 创建目录1.5 创建用户和用户组1.6 修改Mysql用户权限2. 安装MySQL2.1 解压2.2 修改解压目录名称2.3 初始化2.4 添加my.cnf异常找不到Sock文件2.5 启动MySQL服务2.5.1 建立软连接2.5.2 启动2.6 设…

TCP协议工作机制二(滑动窗口,流量控制,拥塞控制,延时应答,捎带应答等)

目录 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况 UDP和TCP对比 滑动窗口 由于TCP是可靠传输,有确认应答,超时重传,连接管理等机制,发送消息时需要等待接收方返回的ack.因此会消耗大量等待ack的时间,我们引入滑动窗口的机制来竭尽可能提高TCP的…

基于支持向量机的Digits手写数字识别

基于支持向量机的Digits手写数字识别 描述 支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;模型既可以用于分类也可以用于回归。手写数字识别是一个多分类问题&#xff08;判断一张手写数字图片是0~9中的哪一个&#xff09;&#xff0c;数据集…

图片英文翻译成中文转换器-中文翻译英文软件

您正在准备一份重要的英文资料或文件&#xff0c;但是您还不是很熟练地掌握英文&#xff0c;需要翻译才能完成您的任务吗&#xff1f;哪个软件能够免费把英文文档翻译成中文&#xff1f;让我们带您了解如何使用我们的翻译软件来免费翻译英文文档为中文。 我们的翻译软件是一款功…

C风格的字符串赋值方式

文章目录&#xff08;1&#xff09;C语言中&#xff0c;没有字符串类型但可以用字符数组模拟字符串。&#xff08;2&#xff09;C语言中&#xff0c;字符串是以’\0’作结尾字符。&#xff08;3&#xff09;C语言中&#xff0c;字符串常量本质上是一个无名的字符数组。C风格的字…

使用Spring JDBC中的JdbcTemplate对数据进行增删改查操作教程~

jdbcTemplate实现添加数据功能&#xff1a; spring框架对jdbc框架进行封装&#xff0c;使用jdbcTemplate方便实现对数据库的操作 数据库准备工作&#xff1a; 在已有数据库中创建新的表&#xff1a; create table t_user (id int,username varchar(20),password varchar(20…

搜索词分析工具-网站关键词挖掘

怎么能找到行业的关键词 以下是如何找到行业关键词的建议&#xff1a; 了解行业&#xff1a;要找到与行业相关的关键词&#xff0c;首先需要了解行业。了解行业以及核心目标&#xff0c;从而更好地理解行业中的主题和词汇。 找到竞争对手网站&#xff1a;搜索竞争对手的网站&…

k8s部署Dashboard

k8s和Dashboard的版本对应关系可以到Dashbord的对应版本里看&#xff0c;比如这里&#xff1a; https://github.com/kubernetes/dashboard/releases/tag/v2.7.0 以下步骤都是在master上执行的。 1. 部署步骤 1. 获取Dashbord的yaml文件 wget https://raw.githubusercontent…