Как прокручивать 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

Другие вопросы по тегам