【问题标题】:Problems while using gtk+3 and Css使用 gtk+3 和 Css 时的问题
【发布时间】:2020-07-10 14:48:55
【问题描述】:

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

  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:

#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 文件

GtkLabel {
    color: blue;
}

【问题讨论】:

  • 您应该将提供程序添加到 StyleContext 以进行显示。添加到单个小部件的 CSS 无法以预期或非常有用的方式工作。如果那“不起作用”,那么显示你做了什么(小部件代码 CSS),并解释发生了什么以及为什么错误 - 因为这对 99.999% 的用户和一个值得打捞。
  • 文本正确显示但没有任何样式,除非我在我的 css 文件中使用 * 选择器
  • 我们有Object Hierarchy 是有充分理由的,您可以从中选择所需的对象,例如GtkLabel。如果您选择您的对象和You scroll to its Description,您将获得所需的所有答案。

标签: css c gtk


【解决方案1】:

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

label { [...] }

我还建议将 StyleContext 加载到 Display,而不是单个小部件。因此,基本上,使用现代版本的 GTK(最好是最新版本 3.24.x,但至少 3.22)和文档化的 CSS 选择器,一切顺利。


一旦这样做,如果您只想影响单个小部件,则只需向它们添加 CSS 类并选择这些类:

gtk_style_context_add_class(my_label_style_context, "the-precious");

然后在 CSS 上选择

label.the-precious { [...] }

或者只是

.the-precious { [...] }

this other answer 中提供了更完整的示例。

这比将 StyleContexts 添加到单个小部件要好,因为这样做往往不会按照用户的预期工作(在继承等方面)。

您还可以在小部件上设置 CSS ID(如 #the-precious),但这不太常用,并且在 GTK 中并不真正需要 IMO,而且设置 IMO 更麻烦。


请注意,默认 GTK 主题 Adwaita 在 3.24 期间已刷新 - 因此,如果您想针对该主题设置应用程序的主题,最好从 3.24 的最新可用版本开始执行此操作 - 并希望它不会在 3.24 中再次更改3.x...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多