O documento discute processamento de eventos no Qt, especificamente reimplementando manipuladores de eventos e instalando filtros de eventos. Eventos são gerados em resposta a ações do usuário ou independentemente e são tratados por objetos através da função event(). Dois tipos comuns de eventos discutidos são eventos de teclado e eventos de timer.
1. Processamento de Eventos
● Reimplementando Manipuladores de Eventos
● Instalando Filtros de Eventos
● Manter Respondendo durante Processamento Intensivo
Eventos são gerados pelo gerenciador de janelas ou pelo próprio Qt em resposta a várias
ocorrências. Quando o usuário pressiona uma tecla ou o botão do mouse, um evento de tecla
(KeyPress) ou um evento do mouse (MouseDown) é gerado. Quando uma janela é exibida pela
primeira vez, um evento paint é gerado para dizer a janela recém visível que ela precisa ser
desenhada. A maioria dos eventos são gerados em resposta às ações de usuários, mas alguns,
como os eventos de timer, são gerados de forma independente pelo sistema.
Quando se programa com Qt, raramente é preciso pensar sobre os eventos, porque os widgets
do Qt emitem sinais quando algo de significativo acontece. Eventos tornamse úteis quando
escrevemos nossos próprios widgets personalizados ou quando queremos modificar o
comportamento dos widgets já existentes do Qt.
Os eventos não devem ser confundidos com sinais. Como regra, os sinais são úteis ao utilizar um
widget, enquanto que os eventos são úteis na implementação de um widget. Por exemplo, quando
estamos usando QPushButton, estamos mais interessados no sinal clicked() do que nos eventos
do mouse em baixo nível ou nos eventos do teclado que causaram o sinal emitido. Mas se
estamos implementando uma classe como QPushButton, precisamos escrever um código para
lidar com os eventos do mouse e do teclado. Assim, devemos emitir o sinal clicked(), quando
necessário.
Reimplementando Manipuladores de Eventos
No Qt, um evento é uma instância de uma subclasse QEvent. Qt trata mais de uma centena de
tipos de eventos, cada uma identificada por um valor de enumeração. Por exemplo, QEvent::type()
retorna QEvent::MouseButtonPress para eventos de pressionamento do botão do mouse.
Muitos tipos de eventos exigem mais informações do que pode ser armazenado em um simples
objeto QEvent; por exemplo: eventos de pressionamento do mouse necessitam armazenar a
informação de qual botão do mouse foi pressionado, bem como onde o ponteiro do mouse estava
posicionado quando o evento ocorreu. Esta informação adicional é armazenado em uma
subclasse derivada da QEvent denominada QMouseEvent.
Os eventos são comunicados aos objetos através da função event(), herdada de QObject. A
implementação de event() em QWidget encaminha os tipos mais comuns de eventos para os
manipuladores específicos de eventos, como mousePressEvent(), keyPressEvent() e
paintEvent().
Já vimos vários manipuladores de eventos ao implementar MainWindow, IconEditor e Plotter em