2010-12-10 3 views
5

Я пытаюсь изменить размеры подкласса QPushButton при закреплении определяемого пользователем угла (не всегда в верхнем левом углу). QPushButton определяет QFrame как своего родителя и свободно плавает в окне. Когда я пытаюсь изменить размер подкласса QPushButton в коде подкласса, я считаю, что это дает мне проблемы, поскольку QPoints, предоставляемые mouseEvents, являются локальными. Я попытался работать с myButton-> mapToGlobal (QPoint) и myButton-> mapFromGlobal, но я не думаю, что я вполне понимаю, как они работают. Поиск примеров оставил меня пустыми руками. Может ли кто-нибудь представить короткий пример?Qt QPoint глобальное/локальное сопоставление

ответ

12

Координаты Локальные (виджет) относительно левого верхнего угла виджета. Глобальные координаты - это координаты экрана. Они легко конвертируются, а такие события, как 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).

Это может быть проще всего, если вы конвертируете все в глобальные координаты, выполняете там вычисления и затем возвращаете результат обратно в виджет, то есть в контексте, в котором вы нуждаетесь.