Qual é a maneira correta de usar o sinal “rolagem-evento” (em um indicador) para o Qt?

3

Estou novamente na mesma posição, quando tive a pergunta Qual é a maneira correta de usar g_signal_connect () em C ++ para quicklists de unidade dinâmica?

Lá fui informado de que a assinatura do meu método estático estava incorreta e que eu tinha que adicionar um argumento de impressão na frente dos outros. Agora eu tenho o mesmo problema, mas para a função chamada para o sinal "rolagem-evento" que eu quero fazer no meu indicador.

Mais especificamente:

//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);

Esta é a função indicator_scrolled:

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

Eu posso ver a mensagem "Indicator was scrolled", mas o programa falhou. Adicionando um argumento de guima na frente dos outros não resolveu o problema.

Então, qual é a assinatura correta para essa função para que ela funcione? Como posso encontrar qual é a assinatura correta a cada vez para evitar esse tipo de pergunta? (Na outra pergunta, o usuário George Edison falou sobre valgrind , mas ele não esclareceu)

Por favor, não aconselhe que os AppIndicators não são a maneira correta de usar o Ubuntu + Qt, por favor veja a questão Faça sniqt reconhecer todas as habilidades de bandeja (ou criar um indicador de trabalho no Qt)

Editar: Após os testes, coincidentemente, descobri que um argumento de orientação precisa ser colocado entre os argumentos GtkStatusIcon e GdkEventScroll. Mas eu realmente gostaria de saber uma maneira de descobrir qual é a assinatura de função correta.

    
por hytromo 01.01.2013 / 16:18

2 respostas

3

Veja o manual de referência: link

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.
    
por Timo 01.01.2013 / 16:48
1

A partir de hoje, após algumas pesquisas e tentativas, esse é meu retorno de chamada de evento de rolagem:

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");
}

Durante uma rolagem eu estou recebendo apenas um UP / DOWN, e então algum SMOOTH (na mesma direção).

Eu não tenho ideia de como gerenciar a direção suave, pois eu preciso da estrutura GdkEventScroll não vista em nenhum lugar; Estou implementando um volume para cima / para baixo no indicador de meu aplicativo e manterei uma sinalização de direção global para que a suavização a seguir seja aplicada na direção atual, mas acho que isso é apenas uma solução alternativa para uma implementação documentada e ruim que é libappindicator .

    
por Zac 25.05.2018 / 07:23