Как получить глобальную geometry от child элемента?
У меня есть label внутри кастомного Frame.
Пытаюсь сделать перемещение всего приложения по MouseEvent:
void settingslogolabel::mouseMoveEvent(QMouseEvent *ev)
{
if ((ev->buttons() & Qt::LeftButton) && firstCIsNotNull){
window()->move( mapToGlobal(ev->pos() - m_dragPosition - this->geometry().topLeft()));
}
}
НО! this->geometry() возвращает только локальную геометрию.
Собственно вопрос - Как получить глобальную geometry()?
Ответы (1 шт):
Виджет расположен в координатах родителя. Окно расположено в глобальных координатах. Т.е. нужно переводить координаты родителя в глобальные:
this->parentWidget()->mapToGlobal(this->pos())
С другой стороны, начало координат виджета - его левый верхний угол, т.е. его позиция. Тогда можно упростить:
this->mapToGlobal(QPoint(0,0))
QMouseEvent::pos() возвращает позицию в координатах виджета - получателя. Если вы хотите переместить окно на разницу между ev->pos() и m_dragPosition, смещать нужно именно окно, т.е. нужно менять его позицию в глобальных координатах. Тогда логика следующая:
auto prev = this->mapToGlobal(m_dragPosition)
auto cur = this->mapToGlobal(ev->pos())
this->window()->move(this->window()->pos() + (cur - prev));
Учитывая, что для нормальных виджетов масштабирование недоступно, вызывать mapToGlobal не обязательно, достаточно смещать на разницу между ev->pos() и m_dragPosition.