Quel est le meilleur moyen (comme dans le plus simple) d’obtenir le pos
d’un mousePressedEvent
dans un QLabel? (Ou, fondamentalement, obtenez simplement l’emplacement d’un clic de souris par rapport à un widget QLabel)
MODIFIER
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(ev); QPoint coordinates = me->pos(); //do stuff return true; } else return false; }
Cependant, je reçois l’erreur de compilation invalid static_cast from type 'QEvent*' to type 'const QMouseEvent*'
sur la ligne où j’essaie de me
déclarer. Des idées que je fais mal ici?
Vous pouvez sous-classer QLabel et réimplémenter mousePressEvent (QMouseEvent *). Ou utilisez 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( 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 qu’il est plus flexible et ne nécessite pas de sous-classement. Mais si vous avez quand même 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 simplement réimplémenter fooEvent ().
J’ai eu le même problème
static_cast invalide …
J’ai juste oublié d’inclure l’en-tête: #include "qevent.h"
Maintenant tout fonctionne bien.