每次用户在
Entry
小部件中插入某些内容时,我都会尝试显示一些内容。例如,我有以下回调:
void entry_text_inserted (GtkEditable* self, gchar* text, gint length, gint* position, gpointer user_data ) {
g_print("Text inserted\n");
}
我将其连接到“插入文本”信号:
GtkWidget *entry = gtk_entry_new();
g_signal_connect(entry, "insert-text", G_CALLBACK(entry_text_inserted), NULL);
但是,这不起作用:运行应用程序时,函数
entry_text_inserted
永远不会被调用。
相比之下,将处理程序连接到
changed
效果非常好:只要文本输入发生问题,就会正确显示“文本已更改”。
void entry_text_changed(GtkEditable *editable, gpointer user_data) {
g_print("Text changed\n");
}
g_signal_connect(entry, "changed", G_CALLBACK(entry_text_changed), NULL);
问题:为什么当我在文本输入中输入内容时,没有调用对
entry_text_inserted
的回调?
完整代码如下:
#include <gtk/gtk.h>
// Callback function for handling text entry changes
void entry_text_inserted (GtkEditable* self, gchar* text, gint length, gint* position, gpointer user_data ) {
g_print("Text inserted\n");
}
void activate (GtkApplication* app, gpointer user_data) {
// Create the main window
GtkWidget *window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "GTK4 Entry Example");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
// Create the Entry widget
GtkWidget *entry = gtk_entry_new();
g_signal_connect(entry, "insert-text", G_CALLBACK(entry_text_inserted), NULL);
gtk_window_set_child(GTK_WINDOW(window), entry);
gtk_widget_show(window);
}
int main(int argc, char *argv[]) {
// Initialize GTK
gtk_init();
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
我尝试过的事情:
g_signal_connect
和GTK_EDITABLE
在GTK_ENTRY
中投射条目:g_signal_connect(GTK_EDITABLE(entry), "insert-text", G_CALLBACK(entry_text_inserted), NULL);
这里讨论了为什么无法将“插入文本”信号直接连接到Gtk.Entry。总结一下, GtkEditable::insert-text 和 GtkEditable::delete-text 信号将从“wrapper”可编辑对象传播到委托,但它们不会从委托传播到“wrapper”可编辑对象,如下所示它们会导致无限递归。
如果要使用信号,则必须使用 get_delegate()
从 Gtk.Entry 获取
Gtk.Editable,并将信号直接连接到 Gtk.Editable。