我发现GtkSpinButton对GTK GUI上的受控输入数字很有用。 但是这里有GTK按钮的一些很好的功能,在许多情况下可能是不需要的。 如果我们在scrolledwindow中有GtkSpinButton,那么用户可能会意外地改变值,或者GtkSpinButton可以从滚动窗口中获取滚动行为。
问题:这里是否有可能使GtkScrollButton对鼠标滚轮不敏感,就像GtkEntry一样。或者更好的是,可以在没有向上/向下按钮的情况下显示GtkSpinButton。 如果没有,如何将滚动信号从GtkSpinButton重定向到滚动窗口?
我试试这个:
SCROLL_numgreen (GtkObject *object, GdkEvent *event, gpointer user_data)
{
switch (((GdkEventScroll *)event)->direction)
{
case GDK_SCROLL_UP:
return TRUE;
break;
case GDK_SCROLL_DOWN:
return TRUE;
break;
... etc...
但这只是从GtkSpinButton“吃掉”滚动信号并在地方阻止滚动窗口。 我最喜欢一些通用的解决方案而不干预每个GtkSpinButton的事件。
答案 0 :(得分:4)
这里有一些指向您查询的内容:
Is here any possibility to make GtkScrollButton insensible to mouse wheel, at way like is GtkEntry?
鼠标滚轮滚动,鼠标单击是事件。事件可以被掩盖。这可以在两个层面完成。
GtkWidget
级别:您可以使用gtk_widget_get_events()
,它将以GdkEventMask
的形式返回事件掩码。您可以根据需要对其进行修改。使用gtk_widget_set_events()
GdkWindow
级:GtkWidget
有自己的绘图/事件区域,其中有GdkWindow
个关联。您可以使用gdk_window_get_events()
获取此窗口的事件掩码,并根据需要更改返回的GdkEventMask
&使用gdk_window_set_events()
将其设置为GdkWindow
。您可以通过按位操作修改事件掩码。如果在多个小部件之间共享GdkWindow
,则此掩码将影响所有小部件。对于屏蔽滚动事件,您可以查看GDK_SCROLL_MASK
,GDK_BUTTON_PRESS_MASK
& GDK_BUTTON_RELEASE_MASK
。您始终可以检查您要查找的事件的掩码是否已设置。 注意:GdkWindow
相关调用仅在为GdkWindow
创建GtkWidget
后才会成功。您可以在窗口小部件的gtk_widget_show()
之后或包含这些窗口小部件的窗口的gtk_widget_show_all
之后进行这些调用。 Or better, could GtkSpinButton be shown without up/down buttons.
AFAIK GtkSpinButton
被实现为具有指示其提供的功能的向上/向下按钮。如果您不想这样,那么您可以选择另一个小部件GtkEntry
(GtkSpinButton
是派生“)或GtkLabel
。当然,您可以根据需要创建自己的小部件(从头开始或从现有的GtkWidget
“派生”)。使用同样的;没有人阻止你这样做:)
How to redirect scroll signal from GtkSpinButton to scrolledwindow?
可以在GtkSpinButton的"scroll-event"
回调中执行此操作。您可以停止在GtkSpinButton
&上发出信号。返回FALSE
传播事件。
...
/* Event callback */
gboolean spinbutton_scroll_handler(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
/* Stop emission on current widget. Default handler also not called */
/* Refer http://developer.gnome.org/gobject/stable/gobject-Signals.html#g-signal-stop-emission-by-name */
g_signal_stop_emission_by_name(widget, "scroll-event");
/* Return FALSE to propagate the event further; thus scroll window will scroll
If TRUE returned other handlers not invoked for this event,
thus no scroll on scroll window */
return FALSE;
}
...
/* Connect scroll-event to the callback */
g_signal_connect(spinbutton, "scroll-event",
G_CALLBACK(spinbutton_scroll_handler),
(gpointer)0);
...
希望这有帮助!