QCursor::pos();呈现错误的坐标
QCursor::pos(); renders wrong coordinates
我有一个应该跟随鼠标的浮动小部件。
现在我有另一个小部件,它有时会改变它的位置。
在任何其他小部件调整大小之前,一切正常。更改后我的坐标总是 误入歧途 并且浮动小部件被移动,它漂浮在离鼠标一定距离的地方。我注意到偏移与 window 大小有某种联系,当大小变大时它会增长。
我用 QCursor::pos();
传递给小部件鼠标坐标,我还尝试从其他背景小部件发送 QPoint
,它应该用 mouseMoveEvent(QMouseEvent *event)
浮动,然后 QPoint{ mapToGlobal( { event->pos() } )};
.它们都呈现相同的坐标,并发生相同的偏移。
例如
小上window
- 漂浮物坐标
QPoint(255,136)
- 另一个小部件的坐标:
QPoint(0,0)
- 来自另一个小部件的 MapToGlobal:
QPoint(255,136)
上大window:
- 漂浮物坐标
QPoint(205,86)
- 另一个小部件的坐标:
QPoint(0,0)
- 来自另一个小部件的 MapToGlobal:
QPoint(205,86)
无法理解问题,为什么会渲染错误的坐标。
系统是Qt 5.12.3。任何帮助将不胜感激。
UPD:最小的可重现示例。
.h
class Area : public QWidget
{
Q_OBJECT
public:
void moveArea();
};
.cpp
void moveArea::Area()
{
move(QCursor::pos());
}
QCursor::pos()
returns 全局(即屏幕)坐标,但如果小部件有父级,则它的位置是在其父级的坐标系中测量的。并且当且仅当小部件没有任何父级时才在全局坐标中测量。所以这段代码
void Area::moveArea()
{
move(QCursor::pos());
}
仅当 Area
对象是顶级 window 时,即它没有父对象时,才会将 Area
对象的左上角移动到鼠标光标位置。如果它有父级(我相信是你的情况),你需要通过将代码更改为 move(parentWidget()->mapFromGlobal(QCursor::pos()));
.
将全局坐标映射到父级坐标
我有一个应该跟随鼠标的浮动小部件。 现在我有另一个小部件,它有时会改变它的位置。
在任何其他小部件调整大小之前,一切正常。更改后我的坐标总是 误入歧途 并且浮动小部件被移动,它漂浮在离鼠标一定距离的地方。我注意到偏移与 window 大小有某种联系,当大小变大时它会增长。
我用 QCursor::pos();
传递给小部件鼠标坐标,我还尝试从其他背景小部件发送 QPoint
,它应该用 mouseMoveEvent(QMouseEvent *event)
浮动,然后 QPoint{ mapToGlobal( { event->pos() } )};
.它们都呈现相同的坐标,并发生相同的偏移。
例如 小上window
- 漂浮物坐标
QPoint(255,136)
- 另一个小部件的坐标:
QPoint(0,0)
- 来自另一个小部件的 MapToGlobal:
QPoint(255,136)
上大window:
- 漂浮物坐标
QPoint(205,86)
- 另一个小部件的坐标:
QPoint(0,0)
- 来自另一个小部件的 MapToGlobal:
QPoint(205,86)
无法理解问题,为什么会渲染错误的坐标。 系统是Qt 5.12.3。任何帮助将不胜感激。
UPD:最小的可重现示例。
.h
class Area : public QWidget
{
Q_OBJECT
public:
void moveArea();
};
.cpp
void moveArea::Area()
{
move(QCursor::pos());
}
QCursor::pos()
returns 全局(即屏幕)坐标,但如果小部件有父级,则它的位置是在其父级的坐标系中测量的。并且当且仅当小部件没有任何父级时才在全局坐标中测量。所以这段代码
void Area::moveArea()
{
move(QCursor::pos());
}
仅当 Area
对象是顶级 window 时,即它没有父对象时,才会将 Area
对象的左上角移动到鼠标光标位置。如果它有父级(我相信是你的情况),你需要通过将代码更改为 move(parentWidget()->mapFromGlobal(QCursor::pos()));
.