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

如何为GtkEntry实现输入有效性背景色切换(非废弃函数)

实现GtkEntry输入校验时的背景色切换(非废弃API)

核心思路

放弃已废弃的gtk_widget_modify_bg(),改用CSS类切换结合GtkStyleContext实现:

  • 预先定义一个CSS类(比如invalid-entry),指定输入无效时的红色背景
  • 输入有效时移除该类,控件自动恢复系统主题默认样式;无效时添加该类触发红色背景

具体实现步骤

1. 定义并加载CSS样式

在程序初始化阶段,加载自定义CSS,为无效状态的输入框设置半透红色背景(适配深浅主题):

#include <gtk/gtk.h>

static void load_custom_css(GtkApplication *app) {
  GtkCssProvider *provider = gtk_css_provider_new();
  const gchar *css = 
    ".invalid-entry {"
    "  background-color: rgba(255, 0, 0, 0.3);"
    "}";
  gtk_css_provider_load_from_data(provider, css, -1, NULL);
  
  gtk_style_context_add_provider_for_display(gdk_display_get_default(),
                                             GTK_STYLE_PROVIDER(provider),
                                             GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
  g_object_unref(provider);
}

2. 实现输入有效性校验函数

以十六进制格式校验为例,编写通用校验逻辑:

static gboolean is_valid_hex(const gchar *text) {
  if (text == NULL || *text == '\0') {
    return FALSE; // 可根据业务需求调整空值是否判定为有效
  }
  for (const gchar *p = text; *p != '\0'; p++) {
    if (!g_ascii_isxdigit(*p)) {
      return FALSE;
    }
  }
  return TRUE;
}

3. 编写信号处理函数

每个GtkEntry的changed信号触发时,执行校验并动态切换CSS类:

// 通用处理函数,适配多个GtkEntry
static void on_entry_changed(GtkEntry *entry, gpointer user_data) {
  const gchar *text = gtk_entry_get_text(entry);
  gboolean valid = is_valid_hex(text);
  
  GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET(entry));
  if (valid) {
    gtk_style_context_remove_class(context, "invalid-entry");
  } else {
    gtk_style_context_add_class(context, "invalid-entry");
  }
}

4. Glade配置注意事项

  • 在Glade中,给每个需要校验的GtkEntry绑定changed信号,指定处理函数为on_entry_changed
  • 如果不同输入框需要不同校验规则,可通过user_data传递校验函数指针或规则标识,扩展通用处理逻辑

关键说明

  • 全程使用GTK3/GTK4的非废弃API(GtkCssProvider、GtkStyleContext),兼容最新版本
  • 移除CSS类后,控件自动恢复系统主题的原始背景色,无需手动保存/恢复颜色值,避免主题适配问题

内容的提问来源于stack exchange,提问作者Dave Buchan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:10:14