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