Как правильно использовать & ldquo; scroll-event & rdquo; сигнал (по индикатору) для Qt?

Я снова на той же позиции, когда у меня возник вопрос Как правильно использовать g_signal_connect () в C ++ для динамических списков быстрого объединения?

Там мне сообщили, что подпись для моего статического метода была неправильной, и мне пришлось добавить аргумент подсказки перед остальными. Теперь у меня та же проблема, но для функции, вызываемой для сигнала «событие прокрутки», который я хочу включить в свой индикатор.

Более конкретно:

//connecting indicator with the scroll-event and altogether with the function indicator_scrolled
g_signal_connect(G_OBJECT(appindicator), "scroll-event", G_CALLBACK(&indicator_scrolled), (gpointer)this);

Это функция индикатор_скролла:

gboolean indicator_scrolled(GtkStatusIcon  *status_icon, GdkEventScroll *event, gpointer data){
    cout << "The indicator was scrolled\n";
    MainWindow* m = (MainWindow*)data;
    m->action_on_scroll();
}

Я вижу сообщение «Индикатор был прокручен», но затем программа вылетала. Добавление аргумента подсказки перед остальными не решило проблему.

Итак, какова правильная подпись для этой функции, чтобы она работала? Как мне каждый раз находить правильную подпись, чтобы избежать подобных вопросов? (На другом вопросе, о котором говорил пользователь Джордж Эдисон valgrind, но он не уточнил)

Пожалуйста, не советуйте, что AppIndicators - не правильный путь для работы с Ubuntu + Qt, см. Вопрос Make sniqt распознает все возможности трея (или создаст рабочий индикатор в Qt)

Редактировать: После тестов я случайно обнаружил, что между аргументами GtkStatusIcon и GdkEventScroll должен быть помещен аргумент guint. Но мне бы очень хотелось узнать, как определить правильную сигнатуру функции.

3
задан 13 April 2017 в 15:23

2 ответа

Посмотрите справочное руководство: https://web.archive.org/web/20130604060558/http://developer.ubuntu.com/api/ubuntu-12.04/c/appindicator/libappindicator- app-Indicator.html # AppIndicator-scroll-event

arg0 : The AppIndicator object
arg1 : How many steps the scroll wheel has taken
arg2 : (type Gdk.ScrollDirection) Which direction the wheel went in
user_data : user data set when the signal handler was connected.
0
ответ дан 13 April 2017 в 15:23

На сегодняшний день, после некоторого поиска и попытки, это мой рабочий обратный вызов события прокрутки:

static void indicator_scrolled(AppIndicator *indicator, guint steps, GdkScrollDirection direction)
{
    if (direction == GDK_SCROLL_DOWN)
        g_print("DOWN\n");
    else if (direction == GDK_SCROLL_UP)
        g_print("UP\n");
    else if (direction == GDK_SCROLL_SMOOTH)
       g_print("SMOOTH\n");
}

Во время прокрутки я получаю только один UP / DOWN, а затем немного SMOOTH ( в том же направлении).

Я понятия не имею, как управлять плавным направлением, так как мне нужна структура GdkEventScroll, которую нигде не видно; Я использую громкость вверх / вниз на индикаторе моего приложения, и я буду поддерживать глобальный флаг направления, чтобы следующее сглаживание было применено к текущему направлению, но я думаю, что это всего лишь обходной путь в грязной и плохо документированной реализации, которая является libappindicator .

0
ответ дан 13 April 2017 в 15:23

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

Похожие вопросы: