我试图在锚定用户定义的角(不总是左上角)时更改QPushButton子类的尺寸。 QPushButton将QFrame定义为其父级,并在窗口中自由浮动。当我尝试在子类代码中更改QPushButton子类的大小时,我认为它给了我麻烦,因为mouseEvents提供的QPoints是本地的。 我曾尝试使用myButton-> mapToGlobal(QPoint)和myButton-> mapFromGlobal,但我认为我不太明白它们是如何工作的。搜索示例让我空手而归。有谁可以提供一个简短的例子?
答案 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坐标)。
如果将所有内容转换为全局坐标,在那里进行计算,然后将结果映射回小部件(即您需要的上下文),这可能是最简单的。