C++ Qt-确定绝对小部件和光标位置

C++ Qt-确定绝对小部件和光标位置,c++,qt,C++,Qt,我有一个包含多个子项的QWidget。最终目标是能够从一个小部件拖放到另一个小部件,在小部件之间移动一些东西。我有一个信号被激发到我的父控件的控制器,可以确定何时拖动开始和结束正确。我当前的问题是确定鼠标是否在鼠标上的目标部件上方 当我在文档中看到它时,我很兴奋,但它在拖放事件中不起作用(当我测试时,它似乎返回了不正确的值)。如果做不到这一点,我的目标是找到包含目标小部件的矩形,并找到它是否包含鼠标上的鼠标坐标。我不能简单地使用它,因为它返回相对于它被调用的小部件的位置。我以为这会给我绝对的屏幕

我有一个包含多个子项的QWidget。最终目标是能够从一个小部件拖放到另一个小部件,在小部件之间移动一些东西。我有一个信号被激发到我的父控件的控制器,可以确定何时拖动开始和结束正确。我当前的问题是确定鼠标是否在鼠标上的目标部件上方

当我在文档中看到它时,我很兴奋,但它在拖放事件中不起作用(当我测试时,它似乎返回了不正确的值)。如果做不到这一点,我的目标是找到包含目标小部件的矩形,并找到它是否包含鼠标上的鼠标坐标。我不能简单地使用它,因为它返回相对于它被调用的小部件的位置。我以为这会给我绝对的屏幕像素值,但它也一直失败。我尝试在父窗口小部件的窗口上调用mapTo,但似乎也失败了

下面的代码显示了我通过各种方法获得的各种QRECT和QPOINT。也许其中一个有一个简单的错误,所以我提供了所有的错误

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);
就我而言,这不起作用,因为目标小部件实际上是由顶级父部件的子部件作为父部件的

更新以下是最终成功的代码。在我的顶级小部件(源小部件和目标小部件的祖先)中,我添加了以下内容:

QRect widgetRect = targetWidget->Geometry();
QPoint mousePos = targetWidget->mapFromGlobal(QCursor::pos());
if(widgetRect.contains(mousePos))
{
// Logic
}

可能您正在QWidget中查找
geometry()
frameGeometry()
。有关更多详细信息,请参见。

正如前面所述,在这种特殊情况下,您应该使用
targetWidget->geometry()
而不是
contentsRect()

接下来,我想知道您发布的代码属于哪个类。应该从坐标相对的QWidget调用方法
QWidget::mapToGlobal()
。如果我没弄错的话,应该是这样的:

QRect widgetRect = targetWidget->geometry();
widgetRect.moveTopLeft(targetWidget->parentWidget()->mapToGlobal(widgetRect.topLeft()));
然后注意
QCursor::pos()
已经返回全局屏幕坐标,因此无需在此映射任何内容:

if (widgetRect.contains(QCursor::pos())) {
    /* swap widgets */
}
编辑:也许最好不要将rect映射到全局,而是将全局光标位置映射到小部件:

if (targetWidget->rect().contains(targetWidget->mapFromGlobal(QCursor::pos()))) {
    /* do stuff */
}

如果鼠标位置在小部件的rect内,则此PyQt方法将返回True,包括鼠标位于小部件内的组合视图上这样的情况

def underMouse(self):
    pos = QtGui.QCursor.pos()
    rect = self.rect()
    leftTop     = self.mapToGlobal(QtCore.QPoint(rect.left(),rect.top()))
    rightBottom = self.mapToGlobal(QtCore.QPoint(rect.right(),rect.bottom()))
    globalRect = QtCore.QRect(leftTop.x(), leftTop.y(), rightBottom.x(), rightBottom.y() )
    return globalRect.contains(self.mapToGlobal(pos))

啊哈,谢谢你!我已经用解决问题的代码更新了我的问题。我在更新的代码片段中看到了一个bug。QWidget的
geometry()
方法返回相对于其父控件的坐标,因此在下一行中似乎应该添加父控件引用
parentWidget()->
QPoint mousePos=targetWidget->parentWidget()->mapFromGlobal(QCursor::pos())