gpt4 book ai didi

user-interface - GtkEntry 更改用户输入的文本

转载 作者:行者123 更新时间:2023-12-01 01:09:00 26 4
gpt4 key购买 nike

在 gui 中,我想修改用户在 GtkEntry 中插入的文本。例如,如果用户输入“joHn doe”,我的 gui 应该会看到这不是一个格式良好的名称,并将其更改为“John Doe”。

我将 a 处理程序连接到“已更改”信号,如 GtkEntry text change signal 中所述.出现的问题是,如果我更改信号处理程序中的条目,“已更改”信号会一次又一次地发出,直到王国来临。

我目前通过进行字符串比较来防止这种情况,如果文本“namified”版本与条目内的文本不相等,我只会更改 GtkEntryBuffer 中的文本。但是,我觉得作为程序员,我应该能够更改条目内的文本,而无需一遍又一遍地调用更改后的处理程序。

更改后的信号处理程序是:

void nameify_entry ( GtkEditable* editable, gpointer data )
{
gchar* nameified;
const gchar *entry_text;

entry_text = gtk_entry_get_text( GTK_ENTRY(editable) );
nameified = nameify(entry_text);

/*is it possible to change the buffer without this using this string
comparison, without the "change" signal being emitted over and over again?*/
if ( g_strcmp0(entry_text, nameified) != 0 ){
GtkEntryBuffer* buf = gtk_entry_get_buffer(GTK_ENTRY(editable) );
gtk_entry_buffer_set_text( buf, nameified, -1 );
}
g_free(nameified);
}

我的命名功能是:
/*removes characters that should not belong to a name*/
gchar*
nameify ( const char* cstr )
{
const char* c;
gchar* ret_val;
GString* s = g_string_new("");

gboolean uppercase_next = TRUE;
g_debug( "string = %s", cstr);

for ( c = cstr; *c != '0'; c = g_utf8_next_char(c) ) {
gunichar cp = g_utf8_get_char(c);
if ( cp == 0 ) break;
if ( g_unichar_isalpha( cp ) ){
if ( uppercase_next ){
g_string_append_unichar( s, g_unichar_toupper(cp) );
uppercase_next = FALSE;
}
else{
g_string_append_unichar(s,g_unichar_tolower(cp));
}
}
if ( cp == '-' ){
g_string_append_unichar( s, cp);
uppercase_next = TRUE;
}
if ( cp == ' '){
g_string_append_unichar( s, cp);
uppercase_next = TRUE;
}
}

ret_val = s->str;
g_string_free(s, FALSE);
return ret_val;
}

任何帮助都是最受欢迎的。

最佳答案

连接到 'changed' 信号并不是很方便,但更适合连接到 'insert-text' 信号。最好让默认的“插入文本”处理程序更新条目。比用g_signal_connect_after在“插入文本”信号上更新条目中的文本,这可以防止更改的信号无限运行。这也应该对 'delete-text' 信号进行,因为如果用户删除一个大写字母,大写字母应该被删除,第二个应该大写。

所以在创建运行:

g_signal_connect_after( entry, "insert-text", G_CALLBACK(name_insert_after), NULL );
g_signal_connect_after( entry, "delete-text", G_CALLBACK(name_delete_after), NULL );

然后你可以拥有这些信号处理程序:
void
name_insert_after (GtkEditable* edit,
gchar* new_text,
gint new_length,
gpointer position,
gpointer data)
{
/*prevent compiler warnings about unused variables*/
(void) new_text; (void) new_length; (void) position; (void) data;
const gchar* content = gtk_entry_get_text( GTK_ENTRY(edit) );
gchar* modified = nameify( content);
gtk_entry_set_text(GTK_ENTRY(edit),modified);
g_free(modified);
}

void
name_delete_after (GtkEditable* edit,
gint start_pos,
gint end_pos,
gpointer data)
{
/*no op cast to prevent compiler warnings*/
(void) start_pos; (void) end_pos; (void) data;
/*get text and modify the entry*/
int cursor_pos = gtk_editable_get_position(edit);
const gchar* content = gtk_entry_get_text( GTK_ENTRY(edit) );
gchar* modified = nameify( content);
gtk_entry_set_text(GTK_ENTRY(edit),modified);
gtk_editable_set_position(edit, cursor_pos);
g_free(modified);
}

这些可以与原始帖子中的 nameify 功能一起使用。
您甚至可以在数据上提供一个函数指针而不是 'NULL' 来使用这个具有不同函数的处理程序,这些函数能够修改条目中的字符串。

关于user-interface - GtkEntry 更改用户输入的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16539127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com