如何结束Gtk Spinbox的连续值更新?

时间:2016-09-24 15:19:14

标签: event-handling gtk

我使用Gtk2制作一个小工具,它的工作原理如下:

  • 算法的几个 Scale Spinbox es控制参数。
  • 当参数更改时,算法将执行,更新后的结果将呈现为图片,如UI所示。

由于算法的工作量很大,我不希望它在频繁更改参数时频繁运行。具体来说,在拖动 Scales 期间或按下 Spinbox 的箭头按钮。相反,我希望算法运行""用户已确定参数。

目前,我收听了 Scale 按钮发布事件,因此该算法仅在 Scale 上进行拖动。但是,这不适合 Spinboxe ,因为它们具有单独的条目和按钮子区域。如果我听 Spinbox 按钮释放,它会表现得很奇怪。

那么我应该监听哪些事件(或多个事件)来获取为Spinbox完成连续值更新的事件?

2 个答案:

答案 0 :(得分:0)

我可以看到你的代码吗? 按钮释放对我很有用。但是,根据您的算法,您可能会收到“反馈”。你确定其余代码没有以某种方式更新你的旋钮吗?

答案 1 :(得分:0)

我使用延迟计算,独立于您用来修改数据的设备。通过这种方式,您还可以使用键盘输入数字或复制并粘贴其内容,程序仍将按预期工作。

在GTK +中执行此操作的方法是利用主循环并使用超时GSource,例如:

#include <gtk/gtk.h>

typedef struct {
    guint       event;
    GSourceFunc callback;
    GtkWidget  *spin_button;
} Algorithm;

static gboolean your_callback(Algorithm *algorithm)
{
    g_print("Your heavy computations go here...\n");
    /* ... */
    algorithm->event = 0;
    return FALSE;
}

static void postpone(Algorithm *algorithm)
{
    if (algorithm->event > 0) {
        g_source_remove(algorithm->event);
    }
    /* Default delay is 1 second (1000 milliseconds) */
    algorithm->event = g_timeout_add(1000, algorithm->callback, algorithm);
}

int main(int argc, char **argv)
{
    GtkWidget *window, *spin_button;
    Algorithm algorithm;

    gtk_init(&argc, &argv);

    spin_button = gtk_spin_button_new_with_range(0, 100, 0.1);
    g_signal_connect_swapped(spin_button, "value-changed",
                             G_CALLBACK(postpone), &algorithm);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_container_add(GTK_CONTAINER(window), spin_button);

    algorithm.event       = 0;
    algorithm.callback    = (GSourceFunc) your_callback;
    algorithm.spin_button = spin_button;

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}