В gui Я хочу изменить текст, который пользователь вставляет в GtkEntry. например, если пользователь вводит «joHn doe», мой gui должен видеть, что это не красиво отформатированное имя и изменяет его на «John Doe».GtkEntry изменить текст ввода пользователем
Я подключаю обработчик к «измененному» сигналу, как описано, например, GtkEntry text change signal. Возникающая проблема заключается в том, что если я изменяю запись в обработчике сигнала, «измененный» сигнал испускается снова и снова, пока не появится королевство.
В настоящее время я предотвращаю это, проводя сравнение строк, и я изменяю текст только в 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);
}
и моя nameify функция:
/*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;
}
любая помощь приветствуется.
+1 Прямо на! Я пропустил часть удаления :) Пожалуйста, подумайте о том, чтобы принять ваш ответ, если он решил вашу проблему, это поможет кому-то, кто может столкнуться с этим в будущем :) –