Qt QPoint全局/本地映射

时间:2010-12-10 20:11:40

标签: qt

我试图在锚定用户定义的角(不总是左上角)时更改QPushButton子类的尺寸。 QPushButton将QFrame定义为其父级,并在窗口中自由浮动。当我尝试在子类代码中更改QPushButton子类的大小时,我认为它给了我麻烦,因为mouseEvents提供的QPoints是本地的。 我曾尝试使用myButton-> mapToGlobal(QPoint)和myButton-> mapFromGlobal,但我认为我不太明白它们是如何工作的。搜索示例让我空手而归。有谁可以提供一个简短的例子?

1 个答案:

答案 0 :(得分:14)

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

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

或者,更短:

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

示例:假设您在(100,110)(屏幕坐标)处有一个顶级窗口小部件w1,其子窗口小部件w2位于(10,10)(w1坐标),而鼠标事件位于w2(20,20) )(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坐标)。

如果将所有内容转换为全局坐标,在那里进行计算,然后将结果映射回小部件(即您需要的上下文),这可能是最简单的。