我使用Gtk2制作一个小工具,它的工作原理如下:
由于算法的工作量很大,我不希望它在频繁更改参数时频繁运行。具体来说,在拖动 Scales 期间或按下 Spinbox 的箭头按钮。相反,我希望算法运行""用户已确定参数。
目前,我收听了 Scale 的按钮发布事件,因此该算法仅在 Scale 上进行拖动。但是,这不适合 Spinboxe ,因为它们具有单独的条目和按钮子区域。如果我听 Spinbox 的按钮释放,它会表现得很奇怪。
那么我应该监听哪些事件(或多个事件)来获取为Spinbox完成连续值更新的事件?
答案 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;
}