6

我正在使用 Haskell 的gtk2hs库编写一个小型 GUI 应用程序,目前正在使用其中的多行文本框。我有一个功能,当用户对文本框中的文本进行更改时,我想运行它,但不希望他们必须单击按钮来激活它。

此外,因为它是一个相当侵入性和处理密集型的功能(它绘制图形,加载文件等),我希望它不会在用户进行任何更改时触发(这可能可以通过文本缓冲区中的bufferChanged信号来完成) '我猜?)但是当他们在更改之间停止几秒钟时。

基本上我想知道 gtk 中是否有一些类似于范围小部件可以将其更新策略设置为连续或延迟的方式,但对于文本框

4

1 回答 1

1

我对 Haskell 绑定一无所知,但在纯 C 中,通过利用超时GSource很容易实现。

#include <gtk/gtk.h>

static guint source_id = 0;

static gboolean do_stuff(gpointer user_data)
{
    g_print("doing stuff...\n");
    return FALSE;
}

static void postpone(void)
{
    if (source_id > 0)
        g_source_remove(source_id);
    source_id = g_timeout_add(1000, do_stuff, NULL);
}

int main(int argc, char **argv)
{
    GtkWidget *window, *text_view;
    GtkTextBuffer *text_buffer;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);

    text_view = gtk_text_view_new();
    gtk_container_add(GTK_CONTAINER(window), text_view);

    text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
    g_signal_connect(text_buffer, "changed", G_CALLBACK(postpone), NULL);

    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

不过,在超时时间过去之前退出 TextView 的问题仍然存在。

于 2013-01-13T11:49:37.970 回答