将mapToGlobal应用于主窗口位置

eri*_*ric 2 qt pyqt pyside

下面是一些创建单个窗口的代码,只是为了好玩,您可以在窗口中单击以进行打印,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()
Run Code Online (Sandbox Code Playgroud)

因为我只使用一个顶级窗口,所以我希望这两组坐标是相同的.也就是说,我希望程序能够意识到,对于应用程序的父窗口,mapToGlobal它只是身份功能.但这不是发生的事情.我以不可解释的方式得到不同的坐标(由我).例如,以下是一个打印输出:

winPos=self.pos(): <86, 101> 
self.mapToGlobal(winPos): <176, 225>
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释发生了什么?

注意,我在某种程度上意识到这是一个愚蠢的练习(从技术上讲,我们在主窗口上并不需要mapToGlobal,正如qtforum上的这篇文章所指出的那样).但是我仍然很好奇是否有人能够在这个角落里理解这种行为.

Ava*_*ris 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()在图像中上图).