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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top