我有一个包含多个孩子的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);
Run Code Online (Sandbox Code Playgroud)
mapToParent不能用于我的目的,因为目标窗口小部件实际上是顶级父窗口的子窗口的父级.
更新这里是最终解决的代码.在我的顶级窗口小部件(它是源窗口小部件和目标窗口小部件的祖先)中,我添加了以下内容:
QRect widgetRect = targetWidget->Geometry();
QPoint mousePos = targetWidget->mapFromGlobal(QCursor::pos());
if(widgetRect.contains(mousePos))
{
// Logic
}
Run Code Online (Sandbox Code Playgroud)
Elr*_*hir 35
如前所述,您应该使用targetWidget->geometry()
而不是contentsRect()
在这种特殊情况下使用.
接下来我想知道你发布的代码属于哪个类.QWidget::mapToGlobal()
应该从您的坐标相对的QWidget调用该方法.如果我找对你,它应该是这样的:
QRect widgetRect = targetWidget->geometry();
widgetRect.moveTopLeft(targetWidget->parentWidget()->mapToGlobal(widgetRect.topLeft()));
Run Code Online (Sandbox Code Playgroud)
然后注意QCursor::pos()
已经返回全局屏幕坐标,所以不需要在这里映射任何东西:
if (widgetRect.contains(QCursor::pos())) {
/* swap widgets */
}
Run Code Online (Sandbox Code Playgroud)
编辑:可能最好不将rect映射到全局,而是将全局光标位置映射到窗口小部件:
if (targetWidget->rect().contains(targetWidget->mapFromGlobal(QCursor::pos()))) {
/* do stuff */
}
Run Code Online (Sandbox Code Playgroud)