Seite 1 von 1

Mausrecorder

Verfasst: 30. Mai 2008 11:29
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

Verfasst: 30. Mai 2008 11:35
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.

Verfasst: 30. Mai 2008 11:40
von flownfluid
Ist es nicht irgendwie möglich Global die Mouse Position abzufangen? Muss ich das wirklich in jedem Widget machen?

Verfasst: 30. Mai 2008 11:42
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

Verfasst: 30. Mai 2008 11:52
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);
 }

Verfasst: 30. Mai 2008 12:01
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.

Verfasst: 30. Mai 2008 14:14
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

Verfasst: 30. Mai 2008 20:34
von upsala

Code: Alles auswählen

bool QCoreApplication::notify ( QObject * receiver, QEvent * event ) 
Ich würde hier ansetzen...

Verfasst: 30. Mai 2008 21:01
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."

Verfasst: 2. Juni 2008 13:36
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

Verfasst: 2. Juni 2008 14:25
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.....
        
   }


Verfasst: 9. Juni 2008 13:43
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

Verfasst: 9. Juni 2008 17:01
von PeterLustig
Und wo ist das Problem? Schau halt mal ein bischen in der Doku herrum was darauf zutreffen könnte...