Seite 1 von 1
mouseMoveEvent
Verfasst: 4. Juli 2012 19:27
von thuering
Hallo Qtler,
heute Abend möchte ich euch mal wieder mit einer Qt-Anfängerfrage beglücken.
Wie soll ein ordentliches mouseMoveEvent ausschauen?
Ich habe mein QGraphicsViewer mit setMouseTracking versehen. (einfach im QtCreator das Häkchen in den EIgenschaften des Viewers gesetzt...)
Wie muss die Methode ausschauen, damit ich am Ende einfach nur
Code: Alles auswählen
ui->label->setText("Koordinaten: X" + maus_x + " Y" + maus_y;
schreiben muss? Die Beispiele im Netz sind rar, kompliziert oder fehlerbehaftet...
Gute Nacht!
Re: mouseMoveEvent
Verfasst: 4. Juli 2012 19:40
von franzf
Wo ist das Problem? Wie du an das maus_x usw. kommst? Die bekommst du aus dem Parameter in mouseMoveEvent.
Wenn es nicht das war was du wissen wolltest, stell bitte eine Frage die man beantworten kann.
Re: mouseMoveEvent
Verfasst: 5. Juli 2012 07:28
von thuering
meine Probleme sind folgende:
a) wie bekomme ich überhaupt ein mouseMoveEvent auf mein QGraphicsViewer hin?
b) wie komme ich an x und y?
zusätzliche Frage:
Wird dieser Event immer dann und nur dann ausgeführt, sobald sich die Maus mindestens einen Pixel auf der Fläche des GraphicsViewer bewegt?
Re: mouseMoveEvent
Verfasst: 5. Juli 2012 09:46
von franzf
1) mouseMoveEvent kommt - wie fast alle Events der Nutzer-Interaktion - vom Windowing system. Qt reicht das Event dann über z.B. mouseMoveEvent an das passende Widget weiter. QGraphicsView kommt auch auf diesem Weg an das Event. Man kann die Events auch selber schicken (siehe QCoreApplication -> sendEvent/pstEvent), als Anfänger solltest du davon aber nicht Gebrauch machen (müssen).
2) Doku -> QMouseEvent (kommt über den Parameter von mouseMoveEvent) - hatte ich aber schon geschrieben.
Re: mouseMoveEvent
Verfasst: 5. Juli 2012 21:32
von thuering
Das verstehe ich nicht.
Nicht mal
Code: Alles auswählen
void MainWindow::mouseMoveEvent( QMouseEvent* event)
{
int xpos = (event->pos()).x();
int ypos = (event->pos()).y();
qDebug() << QString::number(xpos);
qDebug() << QString::number(ypos);
}
funktioniert:
C:\Users\Tobi\Documents\Qt\rpg03-build-desktop\..\rpg03\mainwindow.cpp:39: Fehler:invalid use of incomplete type 'struct QMouseEvent'
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui\qwidget.h:76: Fehler:forward declaration of 'struct QMouseEvent'
C:\Users\Tobi\Documents\Qt\rpg03-build-desktop\..\rpg03\mainwindow.cpp:40: Fehler:invalid use of incomplete type 'struct QMouseEvent'
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui\qwidget.h:76: Fehler:forward declaration of 'struct QMouseEvent'
Was ist falsch? Wieso funktioniert dieser aus einem anderen Beispiel entnommene Code bei anderen?
Re: mouseMoveEvent
Verfasst: 5. Juli 2012 23:13
von franzf
#include <QMouseEvent>
fehlt dir wohl...
Re: mouseMoveEvent
Verfasst: 6. Juli 2012 21:27
von thuering
Da hattest du sehr recht... so ein einfacher Fehler.
Nun klappt das ganze schon recht gut (auf dem MainWindow, nicht auf dem GraphicView). Jedoch nur, während ich die Maustaste gedrückt halte - wie kann ich dafür sorge tragen, dass mir in jedem Fall die aktuelle Mausposition angezeigt wird?
Re: mouseMoveEvent
Verfasst: 6. Juli 2012 22:45
von Christian81
thuering hat geschrieben: wie kann ich dafür sorge tragen, dass mir in jedem Fall die aktuelle Mausposition angezeigt wird?
Indem man sich etwas schlau macht:
http://doc.trolltech.com/4.7/qmouseevent.html#details 
Re: mouseMoveEvent
Verfasst: 9. Juli 2012 10:46
von thuering
QWidget::setMouseTracking(true) hat aber nichts gebracht, zumal es auch schon im Eigenschaften-Dialog des MainWindow aktiviert war.
Re: mouseMoveEvent
Verfasst: 9. Juli 2012 11:40
von franzf
Weil du das mouseTracking nur für dein GraphicsView angemacht hast, aber im MainWindow die mouseMoveEvents abfängst...
Re: mouseMoveEvent
Verfasst: 9. Juli 2012 11:44
von thuering
Nein, ich habe, nachdem ich es nicht hinbekommen habe, dass GraphicsView mit einem mouseMoveEvent auszustatten, die Einstellungen für das MainWindow vorgenommen. Zusätzlich habe ich die Codezeile
im Konstruktor des MainWindow verwendet. Kompiliert gut, bringt mir aber nix.
Re: mouseMoveEvent
Verfasst: 9. Juli 2012 13:11
von slash-ex
thuering hat geschrieben:Nein, ich habe, nachdem ich es nicht hinbekommen habe, dass GraphicsView mit einem mouseMoveEvent auszustatten, die Einstellungen für das MainWindow vorgenommen. Zusätzlich habe ich die Codezeile
Was heißt nicht hinbekommen! entweder member aufrufen oder überladen.
Ich empfehle letzteres. Dann kannst du auch die protected mouseMoveEvent-Funktion überladen und an deine (was auch immer) Bedürfnisse anpasssen.
Vergiss aber nicht die virtuelle Basisfunktion aufzurufen, wenn du bis zum MainWindow Events abfangen willst. Btw. dürfte "MainWindow::setMouseTracking(true); " in 99 % der Fälle keinen Sinn machen. Mir fällt spontan jedenfalls kein Beispiel ein, wo man das Brauchen sollte.