Qt将小部件移动到光标位置

时间:2014-04-09 04:04:12

标签: c++ qt drag-and-drop

我正在实现一个函数(使用Qt),该函数应该将窗口小部件移动到光标位置,作为拖放功能的一部分。

我有三个事件被触发,鼠标按下,鼠标移动和鼠标按下。当鼠标移动并向下移动时,会向窗口小部件发送信号以将其自身移动到光标;但是,我遇到了一些奇怪的行为。

这个简单的代码:

void Block::moveToCursor()
{
    block->move(block->mapFromGlobal(QCursor::pos()));
    qDebug() << block->mapFromGlobal(QCursor::pos());
}

其中&#34;阻止&#34;是一个QLabel,是Block的成员,是窗口中央小部件的子代。

它产生了这个结果:

enter image description here

从调试输出中可以看出,每次像素移动时坐标都是翻转(或闪烁)。第一个坐标是正确的,但第二组坐标似乎是相对于窗口的右上角。

我已经尝试了所有的映射函数:

block->move(block->mapFromParent(QCursor::pos()));

- 使用相对于窗口中心的第二组坐标产生类似的结果。

block->move(block->mapFrom(this->block, QCursor::pos()));

- 这会产生更奇怪的结果。该块不会相对于鼠标闪烁并正确移动,但块的初始位置似乎偏离了计算机屏幕右上角的距离。它也只显示在调试中打印出来的一个点,但它在屏幕上移动。每次看到“继续拖动”时,鼠标都会移动至少一个像素。

enter image description here

有人可以向我解释这个奇怪的行为并向我展示将小部件移动到光标的正确位置,方法是从最初点击它的位置开始吗?

1 个答案:

答案 0 :(得分:4)

要获取与父项相关的坐标(如想要从move() - Method),您需要在父项上使用mapFromGlobal,如下所示:

block->move(block->parentWidget()->mapFromGlobal(QCursor::pos()));

试一试。这样做的原因是,让我们考虑当你在孩子的第1,1位时会发生什么。但是,例如,孩子的父母左上角位于123,123。您现在将其移动到1,1,使其每个跳转122像素。