Domanda

Ho un QWidget che gestisce il mouseevent , ovvero memorizza il mouseposition in un elenco quando viene premuto il pulsante sinistro del mouse. Il problema è che non posso dire al widget di prendere solo un punto ogni x ms.

Quale sarebbe il solito modo per ottenere questi campioni?

Modifica: poiché il mouseevent non viene chiamato molto spesso, è possibile aumentare la tariffa?

È stato utile?

Soluzione

Sembra che tu non voglia affatto la gestione asincrona degli eventi, vuoi solo ottenere la posizione del cursore ad intervalli fissi.

Imposta un timer per sparare ogni x millisecondi. Collegalo a uno slot che ottiene il valore di QCursor :: pos () . Usa QWidget :: mapFromGlobal () se hai bisogno della posizione del cursore in coordinate locali al tuo widget.

Se vuoi farlo solo mentre tieni premuto il pulsante sinistro del mouse, usa mousePressEvent () e mouseReleaseEvent () per avviare / arrestare il timer.

Altri suggerimenti

Hai due scelte. È possibile inserire una logica nel gestore eventi che memorizza il timestamp (in millisecondi) dell'ultimo evento. Quindi controlla quel timestamp con ogni evento e memorizza il punto solo se è trascorso il periodo di tempo corretto.

(questo è il brutto modo) Potresti sempre avere anche un processo da qualche parte nella tua app che registra il gestore eventi ogni x millisecondi (se uno non è già registrato) e quindi annulla la registrazione del gestore eventi per l'evento nel tuo gestore). In questo modo, quando si verifica l'evento, il gestore eventi non viene registrato e il timer si registra nuovamente per l'evento all'intervallo specificato.

È possibile aggiungere un QTimer a colpo singolo collegato a uno slot che imposta un valore booleano su true e modificare lo slot degli eventi del mouse per verificare prima che il valore booleano sia vero e, se impostato su false, fare il codice che normalmente faresti, quindi alla fine imposta il QTimer a scatto singolo in x ms.

Filtralo. Ignora tutti gli input (non metterli nell'elenco) a meno che non sia passato 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();         
}

EDIT: se per caso usi una connessione in coda con OnMouseEvent (se si trova in un thread diverso, improbabile nel tuo caso), usa uno slot proxy collegato direttamente al tuo segnale interessante, filtra al suo interno e solo allora emetti il ??segnale che ti connetti in coda a. In caso contrario, è possibile che il ciclo degli eventi di spam sia inconsapevolmente.

Utilizza un timer anziché gli eventi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top