Event Filters – C++/Qt

eventfilter

“Em Qt, “events” são objectos, derivados da classe abstracta QEvent, que representa acontecimentos que ocorreram no seio de uma aplicação ou como resultado de actividade externa  da qual é necessário tomar conhecimento. Qualquer instância da subclasse QObject pode receber e manipular “Events”, mas estes tornam-se particularmente úteis no caso dos Widgets.

http://doc.trolltech.com/4.5/eventsandfilters.html

As situações é que podemos sentir a necessidade de utilizar esta funcionalidade do Qt são infinitas, por isso vou apenas descrever a situação particular que me levou até os “Event Filters”.

Quando abordei a criação de um “Splashscreen” ( aqui ) ainda não me tinha apercebido que ao clicar sobre a minha “splashimage” esta desaparecia.

Tal acontece porque a classe QSplashScreen, tal como todas as outras, é derivada da classe”QObject” e, entre outros, responde ao evento de clique de rato ( QEvent::MouseButtonPress ).

Uma forma de contornar esta situação consiste em:

  • criar uma nova classe “mySplash” derivando a classe QSplashScreen
  • instalar um “event filter” que apenas “deixa passar” os eventos desejados.

Exemplo 1

O “event filter” bloqueia tudo, ou seja, nem cliques de rato nem teclas podem encerrar prematuramente o “splashscreen“.

#include "mysplash.h"

mySplash::mySplash(QWidget *parent)
        :QSplashScreen(parent)
{
    this->installEventFilter(this);
}

bool mySplash::eventFilter(QObject *target, QEvent *event){
    return true;
}

obter código aqui

Exemplo 2

Consiste numa pequena alteração que permite utilizar um “duplo clique de rato” para encerrar o “splashscreen“.

#include "mysplash.h"

mySplash::mySplash(QWidget *parent)
        :QSplashScreen(parent)
{
    this->installEventFilter(this);
}

bool mySplash::eventFilter(QObject *target, QEvent *event){
    if(event->type() == QEvent::MouseButtonDblClick)
        return false;
    else
        return true;
}

obter código aqui

Claro que este assunto não se esgota por aqui … mas há que continuar a investigar :)

Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s