【发布时间】:2011-05-25 22:27:22
【问题描述】:
我有一个包含多个孩子的 QWidget。最终目标是能够从一个小部件拖放到另一个小部件,在小部件之间移动某些东西。我有一个信号被触发到我的父小部件的控制器,并且可以确定拖动何时正确开始和结束。我目前的问题是确定鼠标是否在鼠标上的目标小部件上方。
当我在文档中看到underMouse 时,我很兴奋,但它在拖放事件期间不起作用(当我测试时,它似乎返回了不正确的值)。如果做不到这一点,我的目标是找到包含目标小部件的矩形,并找出它是否包含鼠标上的鼠标坐标。我不能简单地使用contentsRect,因为它返回相对于它被调用的小部件的位置。我认为mapToGlobal 会给我绝对的屏幕像素值,但它也一直失败。我尝试在父窗口小部件的窗口上调用 mapTo,但这似乎也失败了。
下面的代码显示了我使用各种方法获得的各种 QRects 和 QPoints。也许其中一个有一个简单的错误,所以我已经全部提供了。
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 不适用于我的目的,因为目标小部件实际上是由顶级父级的子级作为父级的。
更新这是最终成功的代码。在我的顶级小部件(它是源小部件和目标小部件的祖先)中,我添加了以下内容:
QRect widgetRect = targetWidget->Geometry();
QPoint mousePos = targetWidget->mapFromGlobal(QCursor::pos());
if(widgetRect.contains(mousePos))
{
// Logic
}
【问题讨论】:
-
我在您更新的代码 sn-p 中发现了一个错误。 QWidget 的
geometry()方法返回相对于其父级的坐标,因此在下一行中您应该添加父小部件引用parentWidget()->:QPoint mousePos = targetWidget->parentWidget()->mapFromGlobal(QCursor::pos());