我编写了一个C语言程序,其中有许多GtkEntry用于数据输入。我用Glade创建了UI,GtkEntry在修改时发出一个on_entry#_changed()信号。我的程序检查输入的有效性,这有一定的要求。例如,必须是有效的十六进制。
我希望一个GtkEntry的背景变成红色,而它是无效的,并回到原来的颜色时,可以接受。原始颜色取决于用户设置的桌面样式。例如,在Ubuntu上,我使用的是“黑暗”风格,所以盒子是深灰色的。
实现这种背景颜色切换的最佳方法是什么,以便应用于单个GtkEntry,并在数据正常时呈现用户选择的样式颜色?我在那里看到了很多讨论,但它经常使用不推荐的函数。
发布于 2022-11-27 04:21:13
可以使用error样式类将条目标记为有错误。下面是一个检查条目是否有有效十六进制数字并更新条目样式的最小示例:
/* 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);
}https://stackoverflow.com/questions/74584399
复制相似问题