使用 gtk+3 和 Css 时出现问题

Problems while using gtk+3 and Css

我正在使用 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;
}

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

label { [...] }

我还建议将 StyleContext 加载到 Display,而不是单个小部件。所以,基本上,使用现代版本的 GTK(最好是最新的第 3 点。24.x,但至少是 3.22)和记录的 CSS select 或者,你就可以开始了。


一旦这样做,如果您只想影响单个小部件,则只需向它们添加 CSS classes 并在那些 classes 上添加 select:

gtk_style_context_add_class(my_label_style_context, "the-precious");

然后 select 在 CSS 上

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

或者只是

.the-precious { [...] }

中提供了更完整的示例。

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

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


请注意,默认的 GTK 主题 Adwaita 在 3.24 期间进行了更新 - 因此,如果您想将您的应用程序作为主题,最好从 3.24 的最新可用版本开始 - 希望它不会改变再次在 3.x...