Como adquirir um evento apenas em momentos definidos?
-
06-07-2019 - |
Pergunta
Eu tenho um QWidget
que lida com o mouseevent
, ou seja, ele armazena o mouseposition
em uma lista quando o botão esquerdo do mouse é pressionado.
O problema é, eu não posso dizer o widget para tomar apenas um ponto cada x ms.
Qual seria a maneira usual para obter essas amostras?
Editar: desde o mouseevent
não é chamado muitas vezes, é possível aumentar a taxa
Solução
Parece que você não quer manipulação de eventos assíncrona em tudo, você quer apenas obter a localização do cursor em intervalos fixos.
Definir um temporizador para disparar a cada x milissegundos. Conectá-lo a uma ranhura que recebe o valor de QCursor::pos()
. Use QWidget::mapFromGlobal()
se precisar a posição do cursor em coordenadas local para o seu widget.
Se você só quer fazer isso enquanto o botão esquerdo do mouse é pressionado, o uso mousePressEvent()
e mouseReleaseEvent()
para iniciar / parar o temporizador.
Outras dicas
Você tem duas opções. Você poderia colocar alguma lógica no manipulador de eventos que armazena o timestamp (em milissegundos) do último evento. Você, então, verificar se timestamp com cada evento e só armazenar o ponto, se o período de tempo adequado tenha passado.
(este é o caminho feio) Você sempre pode também ter um lugar processo em seu aplicativo que registra o manipulador de eventos a cada x milissegundos (se já não estiver registrado) e, em seguida, ter seu manipulador de eventos cancelar o registro para o evento no seu manipulador). Dessa forma, quando o evento acontece, o manipulador de eventos recebe un-registrado eo temporizador registra novamente para o evento em seu intervalo especificado.
Você pode adicionar um único tiro QTimer que está conectado a um slot que define um valor booleano como true, e modificar o seu slot de eventos do mouse para primeira verificação para garantir que o bool é verdade, e se ela é definida como false, faça o código eram normalmente vai fazer, então no final defina o único tiro QTimer para sair em x ms.
filtrá-la. Simplesmente ignorar todas as entradas (não colocá-lo em lista), a menos de x ms se passaram.
QTime m_time; // member of your class
int m_interval = 100; // ms
void MyWidget::StartCapturing()
{
m_time.start();
}
void MyWidget::OnMouseEvent(...)
{
if(m_time.elapsed() < m_interval)
return;
// process event
m_time.reset();
}
EDIT: Se por acaso você usar a conexão na fila para OnMouseEvent (se estiver no segmento diferente, improvável no seu caso), usar um slot de proxy diretamente ligado você sinal interessante, filtro de dentro dela e só então emite o sinal que você conectar na fila para. Caso contrário, você pode enviar spam ciclo de eventos unnessesarily.
Use um temporizador em vez de eventos.