Удалить способность прокрутки из GtkSpinButton - PullRequest
2 голосов
/ 30 сентября 2011

Я считаю, что GtkSpinButton может быть полезен для контролируемых входных чисел в графическом интерфейсе GTK.Но вот некоторые приятные особенности кнопки GTK, которые могут быть нежелательны во многих случаях.Если у нас есть GtkSpinButton внутри scrolledwindow, то пользователь может случайно изменить значение, или GtkSpinButton может взять поведение прокрутки из scrolledwindow.

Вопрос: Есть ли здесь возможность сделать GtkScrollButton нечувствительным к колесу мыши, как GtkEntry.Или лучше, можно ли отображать GtkSpinButton без кнопок вверх / вниз.Если нет, то как перенаправить сигнал прокрутки из GtkSpinButton в окно прокрутки?

Я пытаюсь это сделать:

SCROLL_numgreen (GtkObject *object, GdkEvent *event, gpointer user_data)
{
switch (((GdkEventScroll *)event)->direction)
{
case GDK_SCROLL_UP:
    return TRUE;
    break;

case GDK_SCROLL_DOWN:
    return TRUE;
    break;

... etc...

, но это только «съедает» сигнал прокрутки из GtkSpinButton и блокирует окно прокрутки на месте.Я бы больше всего хотел какое-то общее решение без вмешательства в события каждого GtkSpinButton.

1 Ответ

4 голосов
/ 03 октября 2011

Вот несколько указателей на ваши запросы:

Is here any possibility to make GtkScrollButton insensible to mouse wheel, at way like is GtkEntry?
Прокрутка колесика мыши, щелчок мышью событий . События могут быть замаскированы. Это можно сделать на двух уровнях.

  1. На уровне GtkWidget: вы можете использовать gtk_widget_get_events(), который будет возвращать маску события в виде GdkEventMask. Вы можете изменить это в соответствии со своими потребностями и установить его, используя gtk_widget_set_events()
  2. На уровне GdkWindow: GtkWidget, который имеет свою собственную область рисования / событий, имеет GdkWindow, связанный с ним. Вы можете получить маску событий этого окна с помощью gdk_window_get_events() и изменить возвращенное значение GdkEventMask в соответствии с вашими потребностями и установить значение GdkWindow с помощью gdk_window_set_events() . Вы можете изменить маску события с помощью побитовых операций. Если GdkWindow совместно используется более чем одним виджетом, то эта маска будет влиять на все виджеты. Для маскировки событий прокрутки вы можете посмотреть в GDK_SCROLL_MASK, GDK_BUTTON_PRESS_MASK & GDK_BUTTON_RELEASE_MASK. Вы всегда можете проверить маску для события, которое вы ищете, уже установлено или нет. Примечание : GdkWindow связанные вызовы будут успешными только после создания GdkWindow для GtkWidget. Вы можете сделать эти вызовы после gtk_widget_show() виджета или gtk_widget_show_all окна, которое содержит эти виджеты.

Or better, could GtkSpinButton be shown without up/down buttons.
AFAIK GtkSpinButton имеет кнопку вверх / вниз, указывающую на функциональность, которую он предоставляет. Если вы не хотите этого, вы можете выбрать другой виджет, скажем GtkEntry (из которого GtkSpinButton означает " производная ") или GtkLabel. Конечно, вы можете создать свой собственный виджет (с нуля или " получить " из существующего GtkWidget) в соответствии с вашими потребностями и использовать то же самое; никто не мешает вам делать это:)

How to redirect scroll signal from GtkSpinButton to scrolledwindow?
Это можно сделать в обратном вызове "scroll-event" GtkSpinButton. Вы можете остановить излучение сигнала на GtkSpinButton и вернуть FALSE для распространения события.

...
/* Event callback */
gboolean spinbutton_scroll_handler(GtkWidget *widget, GdkEvent  *event,  gpointer   user_data)
{
    /* Stop emission on current widget. Default handler also not called */
    /* Refer http://developer.gnome.org/gobject/stable/gobject-Signals.html#g-signal-stop-emission-by-name */
    g_signal_stop_emission_by_name(widget, "scroll-event");
    /* Return FALSE to propagate the event further; thus scroll window will scroll
       If TRUE returned other handlers not invoked for this event, 
       thus no scroll on scroll window  */
    return FALSE;
}
...
/* Connect scroll-event to the callback */
g_signal_connect(spinbutton, "scroll-event", 
                 G_CALLBACK(spinbutton_scroll_handler),
                 (gpointer)0);
...

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...