首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改变GtkEntry的背景色

改变GtkEntry的背景色
EN

Stack Overflow用户
提问于 2022-11-26 17:45:04
回答 1查看 47关注 0票数 0

我编写了一个C语言程序,其中有许多GtkEntry用于数据输入。我用Glade创建了UI,GtkEntry在修改时发出一个on_entry#_changed()信号。我的程序检查输入的有效性,这有一定的要求。例如,必须是有效的十六进制。

我希望一个GtkEntry的背景变成红色,而它是无效的,并回到原来的颜色时,可以接受。原始颜色取决于用户设置的桌面样式。例如,在Ubuntu上,我使用的是“黑暗”风格,所以盒子是深灰色的。

实现这种背景颜色切换的最佳方法是什么,以便应用于单个GtkEntry,并在数据正常时呈现用户选择的样式颜色?我在那里看到了很多讨论,但它经常使用不推荐的函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-27 04:21:13

可以使用error样式类将条目标记为有错误。下面是一个检查条目是否有有效十六进制数字并更新条目样式的最小示例:

代码语言:javascript
复制
/* main.c
 *
 * Compile: cc -ggdb main.c -o main $(pkg-config --cflags --libs gtk+-3.0) -o main
 * Run: ./main
 *
 * Author: Mohammed Sadiq <www.sadiqpk.org>
 *
 * SPDX-License-Identifier: LGPL-2.1-or-later OR CC0-1.0
 */

#include <gtk/gtk.h>

static void
entry_changed_cb (GtkEntry *entry)
{
  GtkStyleContext *style;
  const char *text;
  gboolean empty;

  g_assert (GTK_IS_ENTRY (entry));

  style = gtk_widget_get_style_context (GTK_WIDGET (entry));
  text = gtk_entry_get_text (entry);
  empty = !*text;

  /* Loop until we reach an invalid hex digit or the end of the string */
  while (g_ascii_isxdigit (*text))
    text++;

  if (empty || *text)
    gtk_style_context_add_class (style, "error");
  else
    gtk_style_context_remove_class (style, "error");
}

static void
app_activated_cb (GtkApplication *app)
{
  GtkWindow *window;
  GtkWidget *entry;

  window = GTK_WINDOW (gtk_application_window_new (app));

  entry = gtk_entry_new ();
  gtk_widget_set_halign (entry, GTK_ALIGN_CENTER);
  gtk_widget_set_valign (entry, GTK_ALIGN_CENTER);
  gtk_widget_show (entry);
  gtk_container_add (GTK_CONTAINER (window), entry);

  g_signal_connect_object (entry, "changed",
                           G_CALLBACK (entry_changed_cb),
                           app, G_CONNECT_AFTER);
  entry_changed_cb (GTK_ENTRY (entry));

  gtk_window_present (window);
}

int
main (int   argc,
      char *argv[])
{
  g_autoptr(GtkApplication) app = gtk_application_new (NULL, 0);

  g_signal_connect (app, "activate", G_CALLBACK (app_activated_cb), NULL);

  return g_application_run (G_APPLICATION (app), argc, argv);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74584399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档