Seite 1 von 1

Cursorposition nur in einem Widget anzeigen

Verfasst: 22. Januar 2008 23:22
von qtNiko
hallo,

mein Problem:
Ich habe ein MainWindow und darin ein QLabel für die Anzeige von Bildern, das ganz links oben im MainWindow, natürlich unterhalb der Menueleiste, hängt.
Wenn ich die Mouse über das Bild bewege, soll die aktuelle Position in der Statusleiste angezeigt werden. Das funktioniert soweit, aber die Koordinaten stimmen nicht.
Wenn die Mouse ganz links oben im Bild steht, soll (0,0) angezeigt werden. Ich erhalte aber (1, 28 ). Die Position (0,0) liegt oben links im MainWindow, über der Menueleiste. Jetzt könnte ich natürlich einfach von allen Koordinaten (1, 28 ) abziehen, aber das ist sicher nicht die saubere Methode.
Meine konkreten Fragen:
1. Welche Variablen sagen mir, wo das QLabel im MainWindow liegt, damit ich sie subtrahieren kann? - der Designer gibt bei "geometry" an: 0,0, Breite, Höhe
2. Gibt es eine Qt-Funktion, die automatisch die Anzeige auf mein QLabel begrenzt, d.h. außerhalb keine MouseEvents liefert? Oder muss ich das programmieren?
3. Der Konstruktor meines MainWindows enthält "setMouseTracking (true)". Dennoch muss ich eine Mousetaste drücken, damit MouseEvents gesendet werden. Laut Doku sollte dies mit "setMouseTracking (true)" nicht mehr nötig sein. Wie bekomme ich das hin?
4. Eine C++ Frage: derzeit erzeuge ich den String zur Anzeige der Koordinaten etwas umständlich mit

Code: Alles auswählen

 
mouseMoveEvent(QMouseEvent *event) {
	char curs[20];
	sprintf(curs, "(%d, %d)", event->x(), event->y());
	cvar->setText((QString)curs);   // cvar ist ein Pointer auf ein QString und wurde im Konstruktor an die Statusleiste übergeben
}  
Mein ursprünglicher Versuch mit

Code: Alles auswählen

mouseMoveEvent(QMouseEvent *event) {
    QTextStream cursor(&(cvar->text()));    // cvar ist ein Pointer auf ein QString und wurde im Konstruktor an die Statusleiste übergeben
    cursor << "(" << event->x() << ", " << event->y() << ")";
klappt nicht. Der Compiler gibt zwar nur eine Warnung "taking address of temporary" aus, aber das Programm stürzt ab, wenn ich die Mouse bewege.

Code: Alles auswählen

QTextStream cursor(cvar->text()); 
geht auch nicht, weil das Argument ein QString* und nicht ein QString sein muss.
Mit C++ habe ich so meine Probleme, leider immer noch :cry:
Gibt es vielleicht dennoch einen Tipp für mich? :wink:

Verfasst: 23. Januar 2008 08:03
von Christian81

Verfasst: 23. Januar 2008 08:41
von CaptnChaos
Zu deinem Label problem:
1. Am einfachsten gehts mit einem eventfilter. siehe doku
2. Die Position, die du subtrahieren bzw addieren musst bekommst du mit label->geometry(). siehe ebenfalls doku
3. QString.arg() oder einfach QString tmp = QString::number(x) + " : "... siehe doku

und mousetracking funktioniert nur in dem fenster in dem es aktiviert ist. wenn die maus über dem label ist, hat die maus erst mal nichts mehr mit deinem mainwindow zu schaffen, in dem mousetracking aktiviert ist.