如何在 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
我在滚动 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