【问题标题】:GtkScrolledWindow Not Responding to Mouse Wheel Unless Cursor is over Scroll Bar除非光标在滚动条上,否则 GtkScrolledWindow 不响应鼠标滚轮
【发布时间】:2018-05-02 08:29:10
【问题描述】:

我有一个C GTK3 application 使用GtkScrolledWindow,里面有一个GtkGrid。我对所有内容的布局方式感到满意,但 ScrolledWindow 仅在光标位于滚动条上方或使用光标移动滚动条时才通过鼠标滚轮滚动。我正在寻找的行为是鼠标滚轮在使用鼠标滚轮时或至少在光标位于 ScrolledWindow 上方时始终滚动 ScrolledWindow(这是我认为的默认值)。

这里是创建 ScrolledWindow 的地方:

scroll = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scroll), BANNER_HIGHT * 4);

(The location of these lines in the application (GitHub))

我现在想知道是否必须将GtkAdjustment 传递给构造函数,但似乎所做的只是设置滚动边界。我还想知道是否可以在主窗口上连接鼠标滚动事件并尝试在回调中手动触发它,但我也没有办法做到这一点。

【问题讨论】:

  • 我想我应该补充一下GTK的版本是3.22。

标签: c gtk gtk3


【解决方案1】:

这实际上似乎是 GTK 和/或操作系统 (Ubuntu) 中的一个错误,我试图在笔记本电脑的触控板上使用多点触控滚动手势进行滚动,但这不起作用。今天,我碰巧有一个插入了实际滚轮的普通鼠标,发现它工作得很好。

更新:我通过订阅滚动事件并使用 GtkAdjustment 手动调整滚动窗口添加了我正在寻找的行为:

bool scroll_entrires(GtkWidget * widget, GdkEvent * event, gpointer data) {
    double delta_x, delta_y; // delta_y is not used
    if (gdk_event_get_scroll_deltas(event, &delta_x, &delta_y)) {
        GtkAdjustment * adj = gtk_scrolled_window_get_vadjustment(
            GTK_SCROLLED_WINDOW(scroll));
        gtk_adjustment_set_value(adj,
            gtk_adjustment_get_value(adj) + 30 * delta_y);
        // 30 is a number that I like for my setup but can
        // be changed for other situations.
        return true; // We have responded to the event
    }
    return false; // Let other handlers respond to this event
}

// ... (In my init code)

g_signal_connect(window, "scroll-event", G_CALLBACK(scroll_entries), NULL);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多