mouseMoveEvent

Alles rund um die Programmierung mit Qt
Antworten
thuering
Beiträge: 26
Registriert: 1. November 2011 01:48

mouseMoveEvent

Beitrag von thuering »

Hallo Qtler,

heute Abend möchte ich euch mal wieder mit einer Qt-Anfängerfrage beglücken. :mrgreen:
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!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: mouseMoveEvent

Beitrag 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.
thuering
Beiträge: 26
Registriert: 1. November 2011 01:48

Re: mouseMoveEvent

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: mouseMoveEvent

Beitrag 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.
thuering
Beiträge: 26
Registriert: 1. November 2011 01:48

Re: mouseMoveEvent

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: mouseMoveEvent

Beitrag von franzf »

#include <QMouseEvent>
fehlt dir wohl...
thuering
Beiträge: 26
Registriert: 1. November 2011 01:48

Re: mouseMoveEvent

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: mouseMoveEvent

Beitrag 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 :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
thuering
Beiträge: 26
Registriert: 1. November 2011 01:48

Re: mouseMoveEvent

Beitrag von thuering »

QWidget::setMouseTracking(true) hat aber nichts gebracht, zumal es auch schon im Eigenschaften-Dialog des MainWindow aktiviert war.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: mouseMoveEvent

Beitrag von franzf »

Weil du das mouseTracking nur für dein GraphicsView angemacht hast, aber im MainWindow die mouseMoveEvents abfängst...
thuering
Beiträge: 26
Registriert: 1. November 2011 01:48

Re: mouseMoveEvent

Beitrag 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

Code: Alles auswählen

MainWindow::setMouseTracking(true);
im Konstruktor des MainWindow verwendet. Kompiliert gut, bringt mir aber nix.
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Re: mouseMoveEvent

Beitrag 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.
Antworten