如何在 Gtk 3.24.5 中使用箭头键滚动滚动窗口?

How to Scroll a ScrolledWindow with arrow keys in Gtk 3.24.5?

我在滚动 window 的正下方有一个 gtk 条目,它具有默认焦点,左右键在条目中移动光标,我能够捕获向上和向下箭头的按键事件键,但不知道如何滚动滚动的 window,参考了许多网站 none 其中很清楚或仅部分解释。

以下是我浏览的一些页面: https://mail.gnome.org/archives/gtk-devel-list/2002-February/msg00104.html

https://developer.gnome.org/gtkmm-tutorial/stable/sec-keyboardevents-overview.html.en

尝试使用 gtk_scrolled_window_set_vadjustment() 无法正常工作。 官方页面说 GTK_SCROLL_STEP_UP 已弃用,但没有说明应该使用什么来代替。

每一个回答都会很appreciated.Thanks

bool Method::cb_MPWindow(GtkWidget *wgt, GdkEventKey *event, MethodSelect *ms)
{
    if(event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down)
    {  
  
        g_signal_emit_by_name(ms->ScrolledWindow, "scroll-child",(event->keyval == GDK_KEY_Up)?GTK_SCROLL_STEP_UP:GTK_SCROLL_STEP_DOWN);
//The above line works in gtk 3.14.5 but crashes the app in 3.24.5 
        return TRUE;
    }

    return FALSE;
}

为了使用键盘滚动 window,您需要:

  • 通过gtk_scrolled_window_get_vadjustment()gtk_scrolled_window_get_hadjustment()获得滚动的window的垂直或水平调整。
  • 从调整对象中获取以下属性:value(当前滚动位置),step-increment(每行滚动多少),page-increment(多少按页滚动)。
  • 然后,根据按下的键,将增量添加或减去 value,然后用 gtk_adjustment_set_value() 设置新值。

window 设置值更改时会滚动。通常,使用箭头键导航时使用行增量,而使用 Page Up/Down 键时使用页增量。向下滚动时添加它们,向下滚动时减去它们。值得注意的是增量是根据window大小动态变化的,所以不需要手动设置。

这是我的代码(C 语言)。首先设置回调:

// Create a scrolled window
GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);

// Get the vertical adjustment object
GtkAdjustment *page_vertical_adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolled_window));

// Connect to the key press event
g_signal_connect(
    GTK_SCROLLED_WINDOW(scrolled_window),
    "key-press-event",
    G_CALLBACK(keyboard_scrolling),
    page_vertical_adjustment
);

然后是回调函数:

void keyboard_scrolling(GtkScrolledWindow *widget, GdkEventKey event, GtkAdjustment *adjustment)
{
    // Get the vertical position of the page
    gdouble position = gtk_adjustment_get_value(adjustment);

    // Get the scrolling increments
    gdouble step = gtk_adjustment_get_step_increment(adjustment);  // Amount to be scrolled by the arrows (roughly a line)
    gdouble page = gtk_adjustment_get_page_increment(adjustment);  // Amount to be scrolled by the Page keys (roughly the visible area)

    // printf("step: %f, page: %f, key: %d\n", step, page, event.keyval);

    // Check which key was pressed    
    switch (event.keyval)
    {
    case GDK_KEY_Page_Down:
        gtk_adjustment_set_value(adjustment, position + page);
        break;
    
    case GDK_KEY_Page_Up:
        gtk_adjustment_set_value(adjustment, position - page);
        break;
    
    case GDK_KEY_Down:
        gtk_adjustment_set_value(adjustment, position + step);
        break;
    
    case GDK_KEY_Up:
        gtk_adjustment_set_value(adjustment, position - step);
        break;
    
    default:
        break;
    }
}

为方便起见,这里列出了 GTK 接受的键盘宏:https://github.com/GNOME/gtk/blob/main/gdk/gdkkeysyms.h