Как прокручивать ScrolledWindow с помощью клавиш со стрелками в Gtk 3.24.5?
У меня есть запись gtk прямо под прокрученным окном, которое имеет фокус по умолчанию, левая и правая клавиши перемещают курсор в записи, я могу поймать события нажатия клавиш для клавиш со стрелками вверх и вниз, но не знаю, как прокручивать прокрученное окно, ссылались на многие веб-сайты, ни один из них не был понятен или объяснен только частично.
Ниже приведены некоторые страницы, которые я просмотрел: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 устарела, но не говорит, что следует использовать вместо этого.
Мы будем очень благодарны за каждый ответ. Спасибо
bool MethodSelect::cb_MPWindowKeyPress(GtkWidget *wgt, GdkEventKey *event, MethodSelect *ms)
{
if(event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down)
{
// METH_SEL_INFO_DEBUG("%s",gdk_keyval_name (event->keyval));
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;
}
1 ответ
Для того, чтобы прокручивать окно с помощью клавиатуры, необходимо:
- Получите вертикальную или горизонтальную настройку прокручиваемого окна с помощью
gtk_scrolled_window_get_vadjustment()
или жеgtk_scrolled_window_get_hadjustment()
. - Из объекта настройки получить следующие свойства: (текущая позиция прокрутки),
step-increment
(сколько прокручивать по строке) иpage-increment
(сколько прокручивать страницу). - Затем, в соответствии с нажатой клавишей, вы добавляете или вычитаете приращение к
value
а затем установите новое значение с помощьюgtk_adjustment_set_value()
.
Окно будет прокручиваться при изменении, когда вы устанавливаете значение. Обычно приращение строки используется при навигации с помощью клавиш со стрелками, а приращение страницы — при использовании клавиш Page Up/Down. Вы добавляете их при прокрутке вниз и вычитаете при прокрутке вниз. Стоит отметить, что приращения меняются динамически в зависимости от размера окна, поэтому вам не нужно задавать их вручную.
Вот мой код (на 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