Я пытаюсь изменить размеры подкласса QPushButton при закреплении определяемого пользователем угла (не всегда в верхнем левом углу). QPushButton определяет QFrame как своего родителя и свободно плавает в окне. Когда я пытаюсь изменить размер подкласса QPushButton в коде подкласса, я считаю, что это дает мне проблемы, поскольку QPoints, предоставляемые mouseEvents, являются локальными. Я попытался работать с myButton-> mapToGlobal (QPoint) и myButton-> mapFromGlobal, но я не думаю, что я вполне понимаю, как они работают. Поиск примеров оставил меня пустыми руками. Может ли кто-нибудь представить короткий пример?Qt QPoint глобальное/локальное сопоставление
ответ
Координаты Локальные (виджет) относительно левого верхнего угла виджета. Глобальные координаты - это координаты экрана. Они легко конвертируются, а такие события, как QMouseEvent, предлагают как локальные (pos()), так и глобальные (globalPos()) координаты. Если вы хотите карту от Widget A до Widget B, вы можете сделать
const QPoint global = a->mapToGlobal(localPosInA);
const QPoint localInB = b->mapFromGlobal(global);
Или, короче:
const QPoint localInB = a->mapTo(b, localPosInA);
Пример: Скажем, у вас есть виджет w1 верхнего уровня в (100110) (координаты экрана), который имеет дочерний виджет w2 в (10,10) (координаты w1) и событие мыши в w2 в (20, 20) (координаты w2), тогда глобальная позиция курсора мыши равна
(100,110) + (10,10) + (20,20) = (130,140) (координаты экрана)
Это w2-> mapToGlobal (mousePos).
W2-> МАПТО (w1, mousePos) или, как w1 является родителем w2, W2-> mapToParent (mousePos) является
(10,10) + (20,20) = (30,30) (координаты w1).
Это может быть проще всего, если вы конвертируете все в глобальные координаты, выполняете там вычисления и затем возвращаете результат обратно в виджет, то есть в контексте, в котором вы нуждаетесь.