从GtkSpinButton中删除滚动功能

时间:2011-09-30 14:26:56

标签: gtk

我发现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的事件。

1 个答案:

答案 0 :(得分:4)

这里有一些指向您查询的内容:

Is here any possibility to make GtkScrollButton insensible to mouse wheel, at way like is GtkEntry?
鼠标滚轮滚动,鼠标单击是事件。事件可以被掩盖。这可以在两个层面完成。

  1. GtkWidget级别:您可以使用gtk_widget_get_events(),它将以GdkEventMask的形式返回事件掩码。您可以根据需要对其进行修改。使用gtk_widget_set_events()
  2. 设置它
  3. GdkWindow级:GtkWidget有自己的绘图/事件区域,其中有GdkWindow个关联。您可以使用gdk_window_get_events()获取此窗口的事件掩码,并根据需要更改返回的GdkEventMask&使用gdk_window_set_events()将其设置为GdkWindow。您可以通过按位操作修改事件掩码。如果在多个小部件之间共享GdkWindow,则此掩码将影响所有小部件。对于屏蔽滚动事件,您可以查看GDK_SCROLL_MASKGDK_BUTTON_PRESS_MASK& GDK_BUTTON_RELEASE_MASK。您始终可以检查您要查找的事件的掩码是否已设置。 注意GdkWindow相关调用仅在为GdkWindow创建GtkWidget后才会成功。您可以在窗口小部件的gtk_widget_show()之后或包含这些窗口小部件的窗口的gtk_widget_show_all之后进行这些调用。
  4. Or better, could GtkSpinButton be shown without up/down buttons.
    AFAIK GtkSpinButton被实现为具有指示其提供的功能的向上/向下按钮。如果您不想这样,那么您可以选择另一个小部件GtkEntryGtkSpinButton派生“)或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);
    ...
    

    希望这有帮助!