获取鼠标坐标 Qt OpenGL

3
我有一个OpenGL小部件,并且知道可以按照以下方式获取鼠标的坐标:
X = this->mapFromGlobal(QCursor::pos()).x();
Y = this->mapFromGlobal(QCursor::pos()).y();

让我们想象一下我的鼠标在小部件上的(X,Y)位置。现在我想要按下小部件上的鼠标左键,并将光标移动到另一个位置,再次在小部件上(假设为(X',Y')),然后松开鼠标左键。
问题:如何保持(X,Y)和(X',Y')的值?
1个回答

5
最简单的解决方案是将它们存储为成员,就像这样:

class MyGLWidget: public QGLWidget
{
    // ...

private:
    int xAtPress, yAtPress;
};

void MyGLWidget::mousePressEvent(QMouseEvent * event)
{
    xAtPress = event->x();
    yAtPress = event->y();
}

void MyGLWidget::mouseReleaseEvent(QMouseEvent * event)
{
    int xAtRelease = event->x();
    int yAtRelease = event->y();

    // example code
    int dx = xAtRelease - xAtPress;
    int dy = yAtRelease - yAtPress;
    translateObject(dx,dy);
}

注意:使用event->pos()已经可以得到鼠标在小部件坐标系中的位置,这比使用mapFromGlobal(QCursor::pos())要好得多。


谢谢你的回答。你能否解释一下为什么你在最后进行翻译? - Mike
@Mike 很高兴能帮到你 :-) 这个翻译只是一个虚拟的例子,展示了需要同时使用 {x|y}atPress 和 {x|y}atRelease 的可能情况。我选择了这个例子,因为它是一个常见的用例,如果它让你感到困惑,请忽略它 ;-) - Boris Dalstein
@Mike:我看到了你的建议编辑,但它被正确地拒绝了(因为政策是不编辑改变意义的内容,因为帖子的作者可能会不同意)。在这种情况下,我确实不同意:event->pos()总是给出光标相对于小部件左上角的位置(文档:返回鼠标光标相对于接收事件的小部件的位置)。多年的使用经验,包括与QGLWidget的广泛使用,我从未见过这种情况失败。如果您知道反例,我很感兴趣。 - Boris Dalstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接