Pregunta

Tengo un QWidget que maneja el mouseevent , es decir, almacena la mouseposition en una lista cuando se presiona el botón izquierdo del mouse. El problema es que no puedo decirle al widget que tome solo un punto cada x ms.

¿Cuál sería la forma habitual de obtener estas muestras?

Editar: como el mouseevent no se llama con mucha frecuencia, ¿es posible aumentar la tasa?

¿Fue útil?

Solución

Parece que no desea el manejo asíncrono de eventos, solo desea obtener la ubicación del cursor a intervalos fijos.

Configure un temporizador para disparar cada x milisegundos. Conéctelo a una ranura que obtenga el valor de QCursor :: pos () . Utilice QWidget :: mapFromGlobal () si necesita la posición del cursor en las coordenadas locales de su widget.

Si solo desea hacer esto mientras mantiene presionado el botón izquierdo del mouse, use mousePressEvent () y mouseReleaseEvent () para iniciar / detener el temporizador.

Otros consejos

Tienes dos opciones. Puede poner algo de lógica en el controlador de eventos que almacena la marca de tiempo (en milisegundos) del último evento. Luego verifica esa marca de tiempo con cada evento y solo almacena el punto si ha pasado el intervalo de tiempo adecuado.

(esta es la forma fea) Siempre podría tener un proceso en algún lugar de su aplicación que registre el controlador de eventos cada x milisegundos (si aún no está registrado) y luego haga que su controlador de eventos se anule la inscripción para el evento en tu manejador). De esa manera, cuando ocurre el evento, el controlador de eventos se desregistra y el temporizador se vuelve a registrar para el evento en el intervalo especificado.

Puede agregar un QTimer de disparo único que esté conectado a un espacio que establezca un valor booleano en verdadero, y modifique el espacio del evento del mouse para verificar primero para asegurarse de que el valor bool es verdadero, y si está configurado en falso, haga el código que normalmente haría, luego al final configure el QTimer de disparo único para que se active en x ms.

Filtrarlo. Simplemente ignore todas las entradas (no las ponga en la lista) a menos que hayan pasado x ms.

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

EDITAR: si por casualidad usa una conexión en cola para OnMouseEvent (si está en un hilo diferente, es improbable en su caso), use una ranura proxy directamente conectada a su señal interesante, filtre dentro y solo luego emita la señal que conecta en cola a. De lo contrario, podría generar un bucle de evento de spam de manera poco convencional.

Use un temporizador en lugar de eventos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top