You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GTK4 C语言开发中CSS样式未生效问题排查

GTK4按钮CSS样式不生效问题排查与解决

问题描述

我正在使用C语言开发GTK4 GUI程序,尝试为两个按钮添加颜色。已实现加载CSS并设置按钮CSS类名的逻辑,但样式未生效,界面仅显示白色背景与白色按钮。

相关代码

C语言代码:

#include <gtk/gtk.h>

static void on_active(GtkApplication *app){
    // Create a new window and grid
    GtkWidget *s_window = gtk_application_window_new (app);
    gtk_window_set_default_size (GTK_WINDOW (s_window), 800, 800);
    GtkWidget *s_grid   = gtk_grid_new();

    gtk_grid_set_column_spacing(GTK_GRID(s_grid), 15);
    gtk_grid_set_row_spacing(GTK_GRID(s_grid), 15);
    gtk_widget_set_halign (s_grid, GTK_ALIGN_CENTER);
    gtk_widget_set_valign (s_grid, GTK_ALIGN_CENTER);
    gtk_widget_set_hexpand (s_grid, TRUE);

    // Create provider for styling
    GtkCssProvider *cssProvider = gtk_css_provider_new();
    gtk_css_provider_load_from_file(cssProvider, g_file_new_for_path ("styles.css"));
    gtk_style_context_add_provider_for_display(gdk_display_get_default(), GTK_STYLE_PROVIDER(cssProvider), 
                                            GTK_STYLE_PROVIDER_PRIORITY_USER);
    gtk_widget_set_visible(GTK_WIDGET(s_window), TRUE);

    // Create label
    GtkWidget *label  = gtk_label_new("Hello World!");

    // Create buttons: PvP and PvAI
    GtkWidget *button1 = gtk_button_new_with_label ("1");
    gtk_widget_class_set_css_name(GTK_WIDGET_GET_CLASS(button1), "btn1");
    GtkWidget *button2 = gtk_button_new_with_label ("2");
    gtk_widget_class_set_css_name(GTK_WIDGET_GET_CLASS(button2), "btn2");

    // Set button size and position
    gtk_grid_attach(GTK_GRID(s_grid), label, 50, 0, 40, 10);
    gtk_grid_attach(GTK_GRID(s_grid), button1, 50,  50, 40, 10);   
    gtk_grid_attach(GTK_GRID(s_grid), button2, 50, 125, 40, 10);

    gtk_window_set_child (GTK_WINDOW (s_window), s_grid);
    gtk_window_present (GTK_WINDOW (s_window));
}

int main (int argc, char *argv[]) {
    // Create a new application
    GtkApplication *app = gtk_application_new ("com.example.GtkApplication", G_APPLICATION_FLAGS_NONE);
    g_signal_connect (app, "activate", G_CALLBACK (on_active), NULL);
    return g_application_run (G_APPLICATION (app), argc, argv);
}

styles.css内容:

btn1 {
  color: green;
}

btn2 {
  color: blueviolet;
}

问题原因与解决方法

1. 错误使用CSS类设置函数

gtk_widget_class_set_css_name()是修改整个Widget类的CSS标签名,而非给单个控件添加CSS类。这种操作会覆盖按钮的默认CSS类型,导致GTK丢失按钮的基础样式,同时无法实现单个控件的样式区分。

正确做法是使用gtk_widget_add_css_class()给单个按钮添加CSS类:

// 修改按钮创建部分
GtkWidget *button1 = gtk_button_new_with_label ("1");
gtk_widget_add_css_class(button1, "btn1");
GtkWidget *button2 = gtk_button_new_with_label ("2");
gtk_widget_add_css_class(button2, "btn2");

2. CSS选择器类型错误

原CSS中使用btn1作为选择器,这是标签选择器,但我们添加的是CSS类,需要用类选择器(前缀加.):

.btn1 {
  color: green;
  background-color: lightgray; /* 增加背景色确保效果可见 */
}

.btn2 {
  color: blueviolet;
  background-color: lightgray;
}

3. 窗口显示时机问题

原代码中在添加子控件前就调用gtk_widget_set_visible(s_window, TRUE);,可能导致控件未完全初始化就渲染,引发样式异常。建议将这行代码移到gtk_window_set_child之后:

// 调整顺序
gtk_window_set_child (GTK_WINDOW (s_window), s_grid);
gtk_widget_set_visible(GTK_WIDGET(s_window), TRUE);
gtk_window_present (GTK_WINDOW (s_window));

内容的提问来源于stack exchange,提问作者Li En

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:43:13