qt - QCursor::pos();呈现错误的坐标

标签 qt qt5 qt5.12

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

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

我用 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());
}

最佳答案

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

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

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

关于qt - QCursor::pos();呈现错误的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68707535/

相关文章:

c++ - 在 QLineEdit 中接收转义事件?

c++ - 如何将 QQuickItem 扩展作为子扩展添加到另一个 QQuickItem 扩展?

javascript - 在 Windows 上静默安装 Qt55 Enterprise

c++ - 当在创建子项后设置父项时,子项对事件是透明的

qt - 替换 Qt 5.7 中的 QGraphicsWebView

layout - QML 行与行布局

c++ - 当通过引用传递 QObject 时,C++ 信号的参数在 QML 中显示为 `undefined`

c++ - 如何在子类和父类之间添加槽?