3

我有一个应该跟随鼠标的浮动小部件。现在我有另一个小部件,它有时会改变它的位置。

在任何其他小部件调整大小之前,一切正常。更改后我的坐标总是误入歧途并且浮动小部件被移动,它漂浮在离鼠标一定距离的地方。我注意到这种转变以某种方式与窗口大小有关,当尺寸变大时它会增长。

我用 传递给小部件鼠标坐标QCursor::pos();,我还尝试QPoint从其他背景小部件发送,它应该在上面浮动,mouseMoveEvent(QMouseEvent *event)然后QPoint{ mapToGlobal( { event->pos() } )};。它们都渲染相同的坐标,并且发生相同的移位。

例如在一个小窗户上

  • 漂浮物的坐标QPoint(255,136)
  • 另一个小部件的坐标: QPoint(0,0)
  • 来自另一个小部件的 MapToGlobal:QPoint(255,136)

在一个大窗口上:

  • 漂浮物的坐标 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());
}
4

1 回答 1

4

QCursor::pos()返回全局(即屏幕)坐标,但如果小部件有父级,则在其父级坐标系中测量小部件的位置。并且仅当小部件没有任何父级时才以全局坐标测量。所以这段代码

void Area::moveArea()
{
   move(QCursor::pos());
}

仅当对象是顶级窗口时,即没有父窗口时,才会将对象的左上角移动Area到鼠标光标位置。Area如果它有父级(我相信是你的情况),你需要通过将代码更改为将全局坐标映射到父级坐标move(parentWidget()->mapFromGlobal(QCursor::pos()));

于 2021-08-09T11:03:19.233 回答