QCursor::pos(); выдает неправильные координаты

avatar
Mykola Tetiuk
9 августа 2021 в 06:11
126
1
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());
}
Источник
G.M.
9 августа 2021 в 07:34
0

Приведите минимальный воспроизводимый пример. Проблема почти наверняка связана с тем, как вы используете значение, возвращаемое QCursor::pos, а не с самой функцией.

Mykola Tetiuk
9 августа 2021 в 07:43
0

Это довольно просто. Я использую move(QCursor::pos()); внутри виджета. Насколько я понимаю, он должен привязывать левый верхний угол виджета к мышке. И это не так.

Mykola Tetiuk
9 августа 2021 в 07:47
0

Добавлен минимальный воспроизводимый пример.

V.K. author of HiFile
9 августа 2021 в 11:11
0

Это фрагмент кода, а не минимальный воспроизводимый пример. Например, неясно, как вы создаете и показываете экземпляр Area. И самая важная информация отсутствует: есть ли у экземпляра родительский виджет....?

Ответы (1)

avatar
V.K. author of HiFile
9 августа 2021 в 11:03
4

QCursor::pos() возвращает глобальные (т.е. экранные) координаты, но положение виджета измеряется в системе координат его родителя, если у него есть родитель. И измеряется в глобальных координатах тогда и ТОЛЬКО, если у виджета нет родителя. Итак, этот код

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

переместит верхний левый угол объекта Area в позицию курсора мыши, ТОЛЬКО если объект Area является окном верхнего уровня, т.е. когда у него нет родителя. Если у него есть родитель (что, как мне кажется, в вашем случае), вам нужно сопоставить глобальные координаты с координатами родителя, изменив код на move(parentWidget()->mapFromGlobal(QCursor::pos()));.