Qt mouseReleaseEvent () non déclenché?

J’ai une bibliothèque pour afficher des images, appelons-le PictureGLWidget, avec:

class PictureGLWidget: public QGLWidget {

donc PictureGLWidget étend QGLWidget. Dans PictureGlWidget le

  void PictureGlWidget::mouseReleaseEvent(QMouseEvent* releaseEvent); 

est déjà mis en œuvre.

J’ai lancé mon propre projet, disons la classe MyMainWindow, où je viens d’utiliser un PictureGlWidget en tant que Pointerobject:

 PictureGlWidget * myPictureGLWidget = new PictureGlWidget(...); //.. layout->addWidget(myPictureGLWidget , 0, 1); 

Ici, à ce stade, je peux déjà voir le PictureGlWidget et la photo correspondante dans mon MainwindowWidget. Lorsque je clique sur ce PictureGlWidget, maintenez la souris enfoncée, je peux déplacer l’image (comme le défilement 2D), car elle est beaucoup plus grande que ma petite MainWindow.

Plus loin, PictureGlWidget fournit une fonction

 bool PictureGlWidget::getPictureLocation(double& xPos, double& yPos); 

qui me dit juste la position du centre Images, où j’ai publié la coupure actuelle de l’image. Rappelez-vous ma photo est beaucoup plus grande que mon petit MainWindowWidget et donc beaucoup plus grande que mon PictureGLWidget. Imaginez que la photo a 4000x4000px (0,0 en haut à gauche). Le PictureGLWidget est seulement à afficher, disons 800x800px. Ainsi, getPictureLocation () définit les coordonnées centrales de la partie d’image affichée et renvoie quelque chose comme (400, 400), qui peut se situer quelque part dans le coin supérieur gauche au milieu.

Je voudrais saisir les images actuellement affichées (juste une petite partie de la grande image) au centre de la position, après avoir fait défiler ce widget et relâché la souris. Je pensais le faire en écrasant le

MyMainWindow::mouseReleaseEvent(QMouseEvent *event){ qDebug() << "Mouse released!"; }

méthode, mais ne l’a pas encore connecté nulle part. Actuellement, il ne réagit pas sur mon mouseReleases et ce texte n’est pas affiché.

Les méthodes protégées virtuelles dans QWidget que vous pouvez remplacer pour réagir à certains événements n’ont pas besoin d’être “connectées”. Ce ne sont pas des slots Qt mais des fonctions classiques que Qt appelle automatiquement lorsque cela est nécessaire.

Comme expliqué dans la documentation système de Qt Event , si l’implémentation PictureGlWidget::mouseReleaseEvent(QMouseEvent*) accepte l’événement, il n’est pas transmis au widget parent. Mais vous pouvez installer un filtre d’événements sur votre PictureGLWidget et recevoir les événements avant qu’ils ne lui soient envoyés.

 PictureGlWidget * myPictureGLWidget = new PictureGlWidget(...); layout->addWidget(myPictureGLWidget , 0, 1); myPictureGLWidget->installEventFilter(this); 

Puis implémente la bonne méthode dans votre fenêtre principale:

 bool MyMainWindow::eventFilter(QObject *object, QEvent *event) { if (object == myPictureGLWidget && event->type() == QEvent::MouseButtonRelease) { QMouseEvent * mouseEvent = static_cast(event); // Do what you need here } // The event will be correctly sent to the widget return false; // If you want to stop the event propagation now: // return true } 

Vous pouvez même décider si, après avoir fait ce que vous avez à faire, vous voulez arrêter l’événement ou l’envoyer à l’instance PictureQLWidget (comportement normal).

Doc:

N’oubliez pas le mot clé Q_OBJECT dans votre déclaration de classe personnalisée MyGLwidget.