我试图在锚定用户定义的角(不总是左上角)时更改QPushButton子类的尺寸.QPushButton将QFrame定义为其父级,并在窗口中自由浮动.当我尝试在子类代码中更改QPushButton子类的大小时,我认为它给了我麻烦,因为mouseEvents提供的QPoints是本地的.我曾尝试使用myButton-> mapToGlobal(QPoint)和myButton-> mapFromGlobal,但我不认为我完全理解它们是如何工作的.搜索示例让我空手而归.有谁可以提供一个简短的例子?
Fra*_*eld 14
本地(窗口小部件)坐标相对于窗口小部件的左上角.全局坐标是屏幕坐标.它们很容易转换,像QMouseEvent这样的事件同时提供本地(pos())和全局(globalPos())坐标.如果你想从小部件A映射到小部件B,你可以这样做
const QPoint global = a->mapToGlobal( localPosInA );
const QPoint localInB = b->mapFromGlobal( global );
Run Code Online (Sandbox Code Playgroud)
或者,更短:
const QPoint localInB = a->mapTo( b, localPosInA );
Run Code Online (Sandbox Code Playgroud)
示例:假设您在(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坐标).
如果将所有内容转换为全局坐标,在那里进行计算,然后将结果映射回窗口小部件(即您需要的上下文),这可能是最简单的方法.