我有一個包含多個子項的QWidget。最終目標是能夠從一個小部件拖放到另一個小部件,並在小部件之間移動。我有一個信號被觸發到我的父控件的控制器,並可以確定何時拖動正確開始和結束。我目前的問題是確定鼠標是否在鼠標上方的目標部件上方。Qt - 確定絕對小部件和光標位置
當我在文檔中看到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
}
啊哈,謝謝!我用最終解決了我的問題的代碼更新了我的問題。 – 2010-12-15 19:26:40