从GtkSpinButton中删除滚动功能

从GtkSpinButton中删除滚动功能,gtk,Gtk,我发现GtkSpinButton对于GTKGUI上的受控输入数字非常有用。 但是这里有一些GTK按钮的好特性,在很多情况下是不需要的。 若在scrolledwindow中有GtkSpinButton,那个么用户可能会意外地更改值,或者GtkSpinButton可能会从scrolledwindow中获取滚动行为 问:有没有可能让GtkScrollButton对鼠标滚轮不敏感,就像GtkEntry一样。或者更好,GtkSpinButton可以在没有向上/向下按钮的情况下显示。 如果没有,如何将滚动信

我发现GtkSpinButton对于GTKGUI上的受控输入数字非常有用。 但是这里有一些GTK按钮的好特性,在很多情况下是不需要的。 若在scrolledwindow中有GtkSpinButton,那个么用户可能会意外地更改值,或者GtkSpinButton可能会从scrolledwindow中获取滚动行为

问:有没有可能让GtkScrollButton对鼠标滚轮不敏感,就像GtkEntry一样。或者更好,GtkSpinButton可以在没有向上/向下按钮的情况下显示。 如果没有,如何将滚动信号从GtkSpinButton重定向到scrolledwindow

我试试这个:

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事件的通用解决方案。

这里有一些关于您的查询的提示:

这里有没有可能让GtkScrollButton对鼠标滚轮不敏感,就像GtkEntry一样?

鼠标滚轮滚动,鼠标点击都是事件。这些事件可以被掩盖。这可以在两个层次上完成

  • GtkWidget
    级别:您可以使用,它将以的形式返回事件掩码。您可以根据需要对此进行修改,并使用
  • GdkWindow
    级别:
    GtkWidget
    具有自己的绘图/事件区域,并与之关联。您可以使用获取此窗口的事件掩码,并根据需要返回更改&使用将其设置为
    GdkWindow
    。您可以通过逐位操作修改事件掩码。如果在多个小部件之间共享
    GdkWindow
    ,则此掩码将影响所有小部件。对于屏蔽滚动事件,您可以查看
    GDK\u scroll\u MASK
    GDK\u BUTTON\u PRESS\u MASK
    GDK\u BUTTON\u RELEASE\u MASK
    。您可以随时检查正在查找的事件的掩码是否已设置注意
    GdkWindow
    只有在为
    GtkWidget
    创建了
    GdkWindow
    之后,相关调用才会成功。您可以在小部件的
    gtk\u widget\u show()
    或包含这些小部件的窗口的
    gtk\u widget\u show\u all
    之后进行这些调用
  • 或者更好,GtkSpinButton可以在没有向上/向下按钮的情况下显示。

    AFAIK
    GtkSpinButton
    实现为具有向上/向下按钮,指示其提供的功能。如果您不想这样做,那么您可以选择另一个小部件,比如说
    GtkEntry
    (其中
    GtkSpinButton
    是“派生的”)或
    GtkLabel
    。当然,您可以根据需要创建自己的小部件(从头开始或从现有的
    GtkWidget
    )并使用相同的小部件;没有人阻止你这么做:)

    如何将滚动信号从GtkSpinButton重定向到Scrolled窗口?

    可以在GtkSpinButton的
    “滚动事件”
    回调中执行此操作。您可以在
    GtkSpinButton
    &return
    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);
    ...
    

    希望这有帮助

    对不起,我是新来的。g_信号_停止_发射_按_名称(小部件,“滚动事件”);解决了GtkSpinButton和GtkComboBox上的所有滚动问题。这个Gtk真是太棒了!我正在尝试制作自定义小部件;)我把它放在Glade上,但我不能把它们放在编译程序上。从这一点上,我非常接近@user973238:很高兴能帮忙!:)我不知道这类问题是否允许更新,但它接近主题,我应该尝试一下。g_信号_停止_发射_按_名称在gtkSpinButtons上运行良好,但在gtkTextView和gtkTreeView上运行不正常。我可以在这里做一些(简单的)事情吗?gtkTextView将不接受鼠标滚动,并且后面的gtkScrolledWindow将表现为gtkTextView不存在。@user973238:非常抱歉响应太晚。我会检查这个,我不是很确定。请检查,我仍然没有继续这个。在GtkSpinButton上的第一个帮助下,我添加了如下开关“controlpressed”:如果(!ctrlpressed)g_信号停止发射(GTK_控件(对象),“滚动事件”);所以我有两种工作方式取决于按下ctrl键。我想用GtkTextView和TreeView获得同样的效果。当按下ctrl键时,我想滚动文本视图,当释放滚动窗口时。这可能吗?