Cursorposition nur in einem Widget anzeigen

Alles rund um die Programmierung mit Qt
Antworten
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

Cursorposition nur in einem Widget anzeigen

Beitrag 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:
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

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