以下是一些创建单个窗口的代码,只是为了好玩,您可以在窗口中单击以打印self.pos()
和self.mapToGlobal(self.pos())
:
from PySide import QtGui, QtCore
class WinPosExplore(QtGui.QWidget):
def __init__(self):
QtGui.QApplication.setStyle(QtGui.QStyleFactory.create("Plastique"))
QtGui.QWidget.__init__(self)
self.show()
def mousePressEvent(self, event):
if event.buttons() == QtCore.Qt.LeftButton:
winPos=self.pos()
globalWinPos = self.mapToGlobal(winPos)
msg1="winPos=self.pos(): <{0}, {1}>\n".format(winPos.x(), winPos.y())
msg2="self.mapToGlobal(winPos): <{0}, {1}>\n\n".format(globalWinPos.x(), globalWinPos.y())
print msg1 + msg2
def main():
import sys
qtApp=QtGui.QApplication(sys.argv)
myWinPos=WinPosExplore()
sys.exit(qtApp.exec_())
if __name__=="__main__":
main()
因为我只使用一个顶级窗口,所以我希望这两组坐标是相同的。也就是说,我希望程序能够意识到,对于应用程序的父窗口,mapToGlobal
只是身份函数。但这不是发生的事情。我以不可解释的方式得到不同的坐标(由我)。例如,以下是一个打印输出:
winPos=self.pos(): <86, 101>
self.mapToGlobal(winPos): <176, 225>
有人可以解释发生了什么吗?
注意,我在某种程度上意识到这是一个愚蠢的练习(从技术上讲,我们在主窗口上并不需要mapToGlobal,正如this post at qtforum所指出的那样)。但是我仍然很好奇是否有人能够在这个角落里理解这种行为。
答案 0 :(得分:5)
文档:
QPoint QWidget::mapToGlobal ( const QPoint & pos ) const
将窗口小部件坐标
pos
转换为全局屏幕坐标。对于 例如,mapToGlobal(QPoint(0,0))
将给出全局坐标 小部件的左上角像素。
mapToGlobal
的输入是小部件坐标中的一个点,即它相对于小部件区域的左上角。
为了澄清,请考虑docs:
中的此图片
mapToGlobal(self.pos())
会给你self.geometry().topLeft() + self.pos()
注意:mapToGlobal(QPoint(0, 0))
也不会提供与self.pos()
相同的结果。这是因为小部件区域中没有包含标题栏等窗口装饰(请参阅上图中geometry().topLeft()
和pos()
之间的差异)。