Mausrecorder

Alles rund um die Programmierung mit Qt
Antworten
flownfluid
Beiträge: 80
Registriert: 6. Januar 2005 12:54

Mausrecorder

Beitrag von flownfluid »

Hallo zusammen,

ich möchte gerne die Mausbewegungen aufzeichnen und diese schlussendlich abspeichern. So das ich zu einem spätern Zeitpunkt meine Maus mit meiner Aufzeichnung überlagern kann.

Abfangen kann ich ja die Mousebewegungen mit:

Code: Alles auswählen

void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
Abspielen geht dann wohl über QTest Klasse.

Problem:
Leider scheitere ich schon beim Abfangen. Gibt es irgendwie eine Möglichkeit das ich alles abfangen kann. Momentan ist es leider so das sobald ich auf einen Button Klicke, wird das Event wohl schon vom Button verarbeitet und nicht mehr weitergeleitet.

Frage:
Ich habe die QTest Klasse noch nie gebraucht, kann man diese für solche Sachen brauchen? Hat jemand mit dieser Klasse Erfahrung?

Vielen Dank im voraus
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Ich würde jedem Widget einen eventFilter installieren in welchem du dann die Maus events filterst. Natürlich muss auch jedes Widget mouseTracking anhaben.
flownfluid
Beiträge: 80
Registriert: 6. Januar 2005 12:54

Beitrag von flownfluid »

Ist es nicht irgendwie möglich Global die Mouse Position abzufangen? Muss ich das wirklich in jedem Widget machen?
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Es gibt keine Möglichkeit die Bewegung der Maus global abzufangen, nur um abzufragen wo sie sich Global befindet, aber das bringt bei deinem Vorhaben nichts.

Wenn du den eventFilter jedem Widget installierst, dann musst du nur dort die Mausbewegung abfangen. Über foreach und der children() geht das sehr einfach und sauber
flownfluid
Beiträge: 80
Registriert: 6. Januar 2005 12:54

Beitrag von flownfluid »

Leider habe ich das noch nie gebraucht und weiss nicht so genau wie...

Wenn ich das richtig verstehe mache ich in jedem Widget folgendes

Code: Alles auswählen

installEventFilter(this);
Und in meinem QMainWindow:

Code: Alles auswählen

 bool eventFilter(QObject *target, QEvent *event)
 {
         if (event->type() == QEvent::MouseButtonPress
                 || event->type() == QEvent::MouseButtonDblClick
                 || event->type() == QEvent::MouseButtonRelease) {
//record MousePos
             }
             return true;
         }
     }
     return QMainWindow::eventFilter(target, event);
 }
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Ja, nur das du eben nicht return true; machst, sondern auch in dem Fall den anderen Wert returnst. Du willst den Standard ja nicht blocken, nur abfangen und handeln.
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Warum nicht einfach einen Thread oder eine timergesteuerte Funktion machen, wo mit QCursor::pos() die Mausposition abgefragt wird? Um nicht unzählige Werte zu bekommen, sollte man evtl. noch ne Abfrage einbauen, ob sich die Position gegenüber der vorherigen geändert hat.

[edit] hab grad gesehen, der Vorschlag kam ja schon und bringt nichts wegen dem Mouse Press Event
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

bool QCoreApplication::notify ( QObject * receiver, QEvent * event ) 
Ich würde hier ansetzen...
Maxima
Beiträge: 27
Registriert: 23. Mai 2008 03:45

Beitrag von Maxima »

Wie wäre es hiermit:

Code: Alles auswählen

EventFilter QCoreApplication::setEventFilter ( EventFilter filter ) 
"The event filter is a function that is called for every message received in all threads."
flownfluid
Beiträge: 80
Registriert: 6. Januar 2005 12:54

Beitrag von flownfluid »

Hi foks...

Vielen Dank für eure Hilfeleistungen...

Ich habe es nun folgendermassen gelöst:

Bei allen Widgets:

Code: Alles auswählen

installEventFilter(-->parentWidget<--);
Beim mainWidget:

Code: Alles auswählen

bool eventFilter(QObject *target, QEvent *event)
{
         if (event->type() == QEvent::MouseButtonPress)
         {
              //record MousePos in depends of widget
              //record global MousePos
              //record what kind of event
         }
         else if (event->type() == QEvent::MouseButtonRelease)
         {
              //record MousePos in depends of widget
              //record global MousePos
              //record what kind of event
         }
         else if (event->type() == QEvent::MouseButtonClick)
         {
              //record MousePos in depends of widget
              //record global MousePos
              //record what kind of event
         }
         return QMainWindow::eventFilter(target, event);
 }

Zum Ausführen z.B. beim Click:

Code: Alles auswählen

QTest::mouseClick( QApplication::widgetAt(globalMousePos), Qt::LeftButton,0, QPoint ( MousePosinDependsOfWidget),-1 );
Vielen Dank nochmals
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

sowiel ich kenne hat QApplication(argc, argv)
alle event ... und mehr gibt es nicht von der applikation selber...

beispiel:
http://wiki.qtcentre.org/index.php?titl ... OSX_Finder

Code: Alles auswählen


bool QApplication::event(QEvent *ev)
{
    bool eaten;
    switch (ev->type()) {
    case mousemove:
    //// register....
     return QApplication::event(ev);
}
oder den loop allWidgets

Code: Alles auswählen


foreach (QWidget *widget, QApplication::allWidgets())  {
             installevenfilter.....
        
   }

.........................
speack português italiano deutsch english castellà qt
flownfluid
Beiträge: 80
Registriert: 6. Januar 2005 12:54

Beitrag von flownfluid »

Hallo zusammen,

hatte nun endlich zeit mal mein recorder fertig zu schreiben und mit euren tips funktioniert es nun auch einwandfrei.

nun möchte ich gerne noch den mauszeiger und die inputs von der maus irgendwie unterdrücken, während dem ich die aufzeichnung abspiele. nicht das mir der user noch dazwischen funkt mit der maus.

vielen dank
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Und wo ist das Problem? Schau halt mal ein bischen in der Doku herrum was darauf zutreffen könnte...
Antworten