Frage

Ich habe eine QWidget, die die mouseevent behandelt, das heißt, es speichert die mouseposition in einer Liste, wenn die linke Maustaste gedrückt wird. Das Problem ist, ich kann nicht sagen, das Widget nur einen Punkt alle x ms zu nehmen.

Was ist der üblicher Weg sei, diese Proben zu bekommen?

Edit: da die mouseevent nicht sehr oft genannt wird, ist es möglich, die Geschwindigkeit zu erhöhen

War es hilfreich?

Lösung

Es klingt wie Sie überhaupt nicht asynchrones Ereignis wollen Handhabung, Sie wollen einfach nur die Position des Cursors in festen Intervallen erhalten.

einen Timer einrichten alle x Millisekunden abzufeuern. Schließen Sie es an einen Schlitz, der den Wert von QCursor::pos() bekommt. Verwenden Sie QWidget::mapFromGlobal(), wenn Sie die Cursor-Position müssen in Koordinaten lokal für Ihr Widget.

Wenn Sie nur dies tun wollen, während die linke Maustaste gedrückt halten, verwendet mousePressEvent() und mouseReleaseEvent() zum Starten / Stoppen des Timers.

Andere Tipps

Sie haben zwei Möglichkeiten. Sie könnte entweder eine gewisse Logik in der Event-Handler setzen, die den Zeitstempel (in Millisekunden) des letzten Ereignisses speichert. Sie überprüfen dann die Zeitstempel mit jedem Ereignis und nur den Punkt speichern, wenn die richtige Zeitspanne verstrichen ist.

(dies ist die hässliche Art und Weise) Man könnte immer auch einen Prozess hat irgendwo in Ihrer Anwendung, die die Event-Handler all x Millisekunden registriert (wenn man nicht bereits registriert ist) und hat dann Ihre Event-Handler-un-Register für die Veranstaltung in Ihrem Handler). Auf diese Weise, wenn das Ereignis eintritt, der Event-Handler wird un-registrierten und der Timer erneut registriert für das Ereignis in einem festgelegten Intervall.

Sie können einen Single-Shot-QTimer hinzufügen, die mit einem Schlitz verbunden sind, die einen boolean auf true setzt, und die Maus Ereignis Slot ersten Prüfung ändern, um sicherzustellen, dass die bool true ist, und wenn es sie auf false gesetzt ist, tun der Code, den Sie waren in der Regel geht zu tun, dann am Ende des Single-Shot-set QTimer in x ms zu gehen.

Filter es. Nur alle Eingaben ignorieren (nicht setzen es in die Liste), es sei denn x ms vergangen sind.

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: Wird durch Zufall Sie Verbindung zu OnMouseEvent Warteschlange verwenden (wenn es in anderen Thread, unwahrscheinlich, dass in Ihrem Fall ist), einen Proxy-Steckplatz direkt Sie interessante Signal, Filter im Inneren verbunden und nur dann emittieren Signal, das Sie verbinden die Warteschlange gestellt zu. Ansonsten könnten Sie unnessesarily Ereignisschleife Spam.

Verwenden Sie einen Timer statt Ereignisse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top