2010-12-04 9 views
0

Was ist die beste (wie in den einfachsten) Art und Weise, um die pos eines mousePressedEvent in einem QLabel zu erhalten? (Oder grundsätzlich erhalten nur die Position per Mausklick relativ zu einem QLabel widget)Position des Mausklicks in einem QLabel erreichen

EDIT

Ich habe versucht, was Frank auf diese Weise vorgeschlagen:

bool MainWindow::eventFilter(QObject *someOb, QEvent *ev) 
{ 
if(someOb == ui->label && ev->type() == QEvent::MouseButtonPress) 
{ 
    QMouseEvent *me = static_cast<QMouseEvent *>(ev); 
    QPoint coordinates = me->pos(); 
    //do stuff 
    return true; 
} 
else return false; 
} 
jedoch

, erhalte ich die Kompilierung Fehler invalid static_cast from type 'QEvent*' to type 'const QMouseEvent*' in der Zeile, in der ich versuche, me zu deklarieren. Irgendwelche Ideen, was ich hier falsch mache?

Antwort

6

Sie könnten QLabel ableiten und mousePressEvent (QMouseEvent *) erneut implementieren. Oder einen Ereignisfilter verwenden:

bool OneOfMyClasses::eventFilter(QObject* watched, QEvent* event) { 
    if (watched != label) 
     return false; 
    if (event->type() != QEvent::MouseButtonPress) 
     return false; 
    const QMouseEvent* const me = static_cast<const QMouseEvent*>(event); 
    //might want to check the buttons here 
    const QPoint p = me->pos(); //...or ->globalPos(); 
    ... 
    return false; 
} 


label->installEventFilter(watcher); // watcher is the OneOfMyClasses instance supposed to do the filtering. 

Der Vorteil der Ereignisfilterung ist, dass flexibler ist und erfordert keine Subklassen. Wenn Sie aber trotzdem ein benutzerdefiniertes Verhalten als Ergebnis des empfangenen Ereignisses benötigen oder bereits eine Unterklasse haben, ist es einfacher, fooEvent() einfach neu zu implementieren.

+0

Brauchen Sie wirklich 2 'const''s in der Deklaration von mir? Wenn ja warum? Außerdem habe ich Probleme, Ihren Code zu kompilieren, da der Compiler mir 'ungültigen static_cast vom Typ 'QEvent *' gibt, um 'const QMouseEvent *' in dieser Zeile einzugeben – wrongusername

+0

Haben Sie eingeschlossen? Die Störungen sind nicht unbedingt notwendig, aber ich halte es für eine gute Übung, die Provisorien konstant zu machen. –

+0

ah ja, ich habe das nicht aufgenommen. Vielen Dank! Ich fragte mich jedoch, warum es nicht nur "const QMouseEvent * me" war ... was macht die zweite const? – wrongusername

0

hatte ich das gleiche Problem

ungültig static_cast ...

ich den Header enthalten vergessen, nur: #include "qevent.h"

Jetzt alles gut funktioniert.