用鼠标移动物体

时间:2012-06-23 19:39:01

标签: qt drag qlabel

我使用Qt,我想用鼠标移动一些物体。例如,用户单击对象并将此对象拖动到另一个窗口位置。我怎么能这样做?

我试过了mouseMoveEvent:

void QDropLabel::mouseMoveEvent(QMouseEvent *ev)
{
    this->move(ev->pos());
}

但遗憾的是对象移动非常奇怪。它从一个地方跳到另一个地方。

QDropLabel继承QLabel。它还给了一个像素图。 我尝试用不同的对象来做,但结果是一样的。

1 个答案:

答案 0 :(得分:18)

您的可移动小部件必须有QPoint offset成员。它将存储光标点击相对于小部件左上角的位置:

void DropLabel::mousePressEvent(QMouseEvent *event)
{
    offset = event->pos();
}

在鼠标移动事件中,您只需在其父坐标系中移动窗口小部件。请注意,如果您没有从光标位置减去offset,您的小部件将“跳转”,因此其左上角将位于光标下方。

void DropLabel::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {
        this->move(mapToParent(event->pos() - offset));
    }
}