2010-12-10 19 views
5

我试图在锚定用户定义的角落(并非总是左上角)时更改QPushButton子类的维度。 QPushButton定义了一个QFrame作为它的父对象,并且在窗口中自由浮动。当我尝试在子类代码中更改QPushButton子类的大小时,我相信它给我带来麻烦,因为mouseEvents提供的QPoint是本地的。 我试图使用myButton-> mapToGlobal(QPoint)和myButton-> mapFromGlobal,但我不认为我完全理解它们的工作方式。搜索例子让我空手而归。任何人都可以提供简单的例子吗Qt QPoint全局/本地映射

回答

12

本地(窗口小部件)坐标相对于窗口小部件的左上角。全局坐标是屏幕坐标。它们很容易转换,像QMouseEvent这样的事件同时提供本地(pos())和全局(globalPos())坐标。 如果你想从窗口小部件的地图窗口小部件B,你可以做

const QPoint global = a->mapToGlobal(localPosInA); 
const QPoint localInB = b->mapFromGlobal(global); 

或者更短:

const QPoint localInB = a->mapTo(b, localPosInA); 

示例:假设你有一个顶级窗口部件W1(100,110) (屏幕坐标),其具有在(10,10)(w1坐标)处的子部件w2和在(20,20)(w2坐标)处的w2中的鼠标事件,则鼠标光标的全局位置是

(100,110)+(10,10)+(20,20)=(130,140)(屏幕坐标)

这就是w2-> mapToGlobal(mousePos)。

W2-> mapTo(W1,mousePos结构),或如w1为w2的父,W2-> mapToParent(mousePos结构)是

(10,10)+(20,20)=(30,30 )(w1坐标)。

这可能是最简单的,如果你将所有的都为全局坐标,执行计算那里,然后将结果映射回你需要它的部件,即上下文。