将处理程序连接到 GTK4 中的插入文本信号

问题描述 投票:0回答:1

每次用户在

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);
  • (迷信地)将 g_signal_connect 语句移动到小部件添加到窗口之后。
gtk signals textfield gtk4
1个回答
0
投票

这里讨论了为什么无法将“插入文本”信号直接连接到Gtk.Entry。总结一下, GtkEditable::insert-textGtkEditable::delete-text 信号将从“wrapper”可编辑对象传播到委托,但它们不会从委托传播到“wrapper”可编辑对象,如下所示它们会导致无限递归。

如果要使用信号,则必须使用 get_delegate()Gtk.Entry 获取

Gtk.Editable
,并将信号直接连接到 Gtk.Editable

© www.soinside.com 2019 - 2024. All rights reserved.