首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用gtk+3和Css时遇到的问题

使用gtk+3和Css时遇到的问题
EN

Stack Overflow用户
提问于 2020-07-10 06:48:55
回答 1查看 190关注 0票数 1

我用C语言用GTK+3创建了一个图形用户界面,我想用CSS制作这个应用程序的样式。问题是小部件不接受我给他们的样式,除非我在CSS文件中使用*选择器。第一次,我试着用gtk_style_context_add_provider_for_screen()为所有应用程序创建一个CSS文件,但这不起作用。因此,我尝试使用一个函数按小部件设置样式小部件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  void SetStyleWidget (GtkCssProvider *CssProvider, char *Path, GtkWidget *Widget)
{
    gtk_css_provider_load_from_path (CssProvider, Path, NULL);
                                                                   
    gtk_style_context_add_provider (gtk_widget_get_style_context(Widget), GTK_STYLE_PROVIDER(CssProvider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); 
                                  
    gtk_style_context_save (gtk_widget_get_style_context(Widget));
}

这也没用。我还发现,这可能是一个优先级问题,但无论我添加什么优先级,它都不起作用。有人能回答我的问题吗?

这里是我的c文件和我的css:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdlib.h>
#include <gtk/gtk.h>
#include <gmodule.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include "RandFuncGTK.h"

int main(int argc, char **argv)
{
    GtkWidget *pWindow;
    GtkWidget *pBoxLevel0;
    GtkWidget *pTitreImg;
    GtkWidget *pBoiteTitreImage;
    GtkWidget *pLabTest;
    GtkCssProvider *CssProvider;

    gtk_init(&argc, &argv);

    CssProvider = gtk_css_provider_new ();

    pWindow = CreateWindow(pWindow, "Test", 1000, 1000);

    pBoxLevel0 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 100);
    gtk_container_add(GTK_CONTAINER(pWindow), pBoxLevel0);

    pLabTest = gtk_label_new("Test");
    SetStyleWidget(CssProvider, "css/labstyle.css", pLabTest);
    gtk_container_add(GTK_CONTAINER(pBoxLevel0), pLabTest);

    gtk_widget_show_all(pWindow);

    g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    gtk_main();
    return EXIT_SUCCESS;

}

这是我的css文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GtkLabel {
    color: blue;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-10 08:00:02

GTK停止在版本3.18左右中使用小部件类型名称作为CSS节点名,从那时起,您必须检查C类文档,以查看哪些节点名称、类等可用于主题。在这个案例中,它将是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
label { [...] }

我还建议将StyleContext加载到显示中,而不是单个小部件。因此,基本上,使用一个现代版本的GTK (最好是最新的3.24.x点,但至少是3.22点)和文档化的CSS选择器,这样就可以了。

这样做之后,如果您只想影响各个小部件,那么只需向它们添加CSS类并在这些类上选择:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gtk_style_context_add_class(my_label_style_context, "the-precious");

然后在CSS中选择on

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
label.the-precious { [...] }

或者只是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.the-precious { [...] }

另一个答案中有一个更完整的示例。

这比将StyleContexts添加到各个小部件要好,因为这样做不符合用户的期望(在继承等方面)。

您也可以在小部件(如#the-precious)上设置CSS in,但这并不经常使用,而IMO在GTK中并不真正需要,更像是一个faff来设置IMO。

请注意,默认的GTK主题Adwaita是在3.24期间刷新的--因此,如果您想根据该主题对应用程序进行主题化,最好从最新版本的3.24中进行,并希望它不会在3.x中再次更改.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62836836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文