2010-12-04 6 views
0

Quel est le meilleur moyen (le plus simple) d'obtenir le pos d'un mousePressedEvent dans un QLabel? (Ou fondamentalement juste obtenir l'emplacement d'un clic de souris par rapport à un widget QLabel)Obtenir la position d'un clic de souris dans un QLabel

EDIT

J'ai essayé ce que Frank a suggéré de cette façon:

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; 
} 

Cependant, je reçois la compilation erreur invalid static_cast from type 'QEvent*' to type 'const QMouseEvent*' sur la ligne où j'essaie de déclarer me. Des idées de ce que je fais mal ici?

Répondre

6

Vous pouvez sous-classer QLabel et réimplémenter mousePressEvent (QMouseEvent *). Ou utiliser un filtre d'événement:

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. 

L'avantage du filtrage des événements est plus souple et ne nécessite pas subclassing. Mais si vous avez besoin d'un comportement personnalisé à la suite de l'événement reçu ou si vous avez déjà une sous-classe, il est plus simple de réimplémenter fooEvent().

+0

Avez-vous vraiment besoin de 2 'const' dans la déclaration de moi? Si oui, pourquoi? Aussi, j'ai du mal à compiler votre code car le compilateur me donne 'static_cast invalide du type 'QEvent *' pour taper 'const QMouseEvent *'' sur cette ligne – wrongusername

+0

Avez-vous inclus ? Les consts ne sont pas strictement nécessaires, mais je considère que c'est une bonne pratique de faire des provisoires const. –

+0

ah oui, je ne l'ai pas inclus. Merci! Ce que je me demandais cependant, c'était pourquoi ce n'était pas juste "const QMouseEvent * moi" ... que fait le second const? – wrongusername

0

J'ai eu le même problème

static_cast invalide ...

Je viens oublié d'inclure l'en-tête: #include "qevent.h"

Maintenant, tout fonctionne bien.

Questions connexes