J'ai un QWidget qui contient plusieurs enfants. Le but ultime est d'être capable de glisser et déposer d'un widget à l'autre, en déplaçant quelque chose entre les widgets. J'ai un signal envoyé au contrôleur de mon widget parent et je peux déterminer quand le glisser commence et se termine correctement. Mon problème actuel consiste à déterminer si la souris est au-dessus du widget cible à la souris.Qt - Déterminer la position absolue du widget et du curseur
Je me suis excité quand j'ai vu underMouse dans les docs, mais cela ne fonctionne pas pendant les événements de glisser-déposer (quand j'ai testé, il semblait retourner des valeurs incorrectes). A défaut, mon but était de trouver le rectangle contenant le widget cible et de trouver s'il contenait les coordonnées de la souris sur une souris. Je ne peux pas simplement utiliser contentsRect, car il renvoie des positions relatives au widget sur lequel il est appelé. Je pensais que mapToGlobal me donnerait des valeurs absolues de pixels d'écran, mais il continue à échouer aussi bien. J'ai essayé d'appeler mapTo sur la fenêtre du widget parent, mais cela semblait également échouer.
Ci-dessous est le code montrant les différents QRects et QPoints que j'ai obtenus avec les différentes méthodes. Peut-être qu'il y a une erreur simple avec l'un d'entre eux, alors je les ai tous fournis.
QRect relativeWidgetRect = targetWidget->contentsRect();
QRect *absoluteWidgetRect = new QRect(QWidget::mapToGlobal(relativeWidgetRect.topLeft()), QWidget::mapToGlobal(relativeWidgetRect.bottomRight()));
QRect *widgetRect = new QRect(mapTo(window(), relativeWidgetRect.topLeft()), mapTo(window(), relativeWidgetRect.bottomRight()));
QPoint relativeMousePos = QCursor::pos();
QPoint absoluteMousePos = QWidget::mapToGlobal(relativeMousePos);
QPoint widgetMousePos = mapTo(window(), relativeMousePos);
mapToParent ne fonctionnera pas pour mes besoins, puisque le widget cible est en fait par un enfant parented du parent haut niveau.
Mise à jour Voici le code qui a fini par s'arranger. Dans mon widget de haut niveau (qui était un ancêtre à la fois la source et des widgets cibles), j'ajouté:
QRect widgetRect = targetWidget->Geometry();
QPoint mousePos = targetWidget->mapFromGlobal(QCursor::pos());
if(widgetRect.contains(mousePos))
{
// Logic
}
Aha, merci! J'ai mis à jour ma question avec le code qui a fini par résoudre mon problème. –