Tengo un QWidget que contiene varios elementos secundarios. El objetivo final es poder arrastrar y soltar de un widget al otro, moviendo algo entre widgets. Tengo una señal que se dispara al controlador de mi widget padre y puedo determinar cuándo el arrastre se inicia y finaliza correctamente. Mi problema actual es determinar si el mouse está arriba del widget de destino o no.Qt - Determine el widget absoluto y la posición del cursor
Me entusiasmé cuando vi underMouse en los documentos, pero no funciona durante los eventos de arrastrar y soltar (cuando lo probé, parecía devolver valores incorrectos). A falta de esto, mi objetivo era encontrar el rectángulo que contenía el widget de destino y encontrar si contenía las coordenadas del mouse con el mouse hacia arriba. No puedo simplemente usar contentsRect, ya que devuelve las posiciones relativas al widget al que se está llamando. Pensé que mapToGlobal me daría valores de píxel de pantalla absolutos, pero también falla. Intenté llamar a mapTo en la ventana del widget principal, pero también pareció fallar.
A continuación se muestra un código que muestra los diversos QRects y QPoints que he obtenido con los diversos métodos. Tal vez haya un error simple con una de ellas, así que las he proporcionado todas.
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 no va a funcionar para mis propósitos, ya que el control destino es en realidad secundario de ningún hijo de la matriz de nivel superior.
Actualización Aquí está el código que terminó funcionando. En mi aparato de nivel superior (que era un antepasado de la fuente y el destino de widgets), que añadió esto:
QRect widgetRect = targetWidget->Geometry();
QPoint mousePos = targetWidget->mapFromGlobal(QCursor::pos());
if(widgetRect.contains(mousePos))
{
// Logic
}
Aha, gracias! He actualizado mi pregunta con el código que terminó resolviendo mi problema. –