是什么决定了PyQt小部件的相对坐标?

时间:2012-09-05 18:18:14

标签: python pyqt move

当我在PyQt中使用move(x, y)函数时,小部件移动到哪个精确坐标?我认为xy是相对于什么的,但是对于什么?

2 个答案:

答案 0 :(得分:2)

X和Y相对于父窗口小部件的坐标空间

这是一个可运行的小例子,它将向您展示移动相对于小部件的父级的方式。父级可以是None,这意味着将浮动的顶级小部件。无论如何,它总是相对于父级的坐标一直到屏幕坐标。

from PyQt4 import QtCore, QtGui
from random import randint

from collections import deque

class Widget(QtGui.QWidget):

    def __init__(self):
        super(Widget, self).__init__()

        self.setObjectName("MainWindow")

        mainLayout = QtGui.QVBoxLayout(self)
        mainLayout.setSpacing(0)
        mainLayout.setMargin(20)

        self.widgets = deque()
        self.widgets.append(None)
        self.widgets.append(self)

        for i in xrange(3): 
            w = QtGui.QWidget()
            name = "widget%d" % i
            color = [str(randint(0,255)) for _ in xrange(3)]
            w.setObjectName(name)
            w.setStyleSheet("#%s { background: rgb(%s) }" % (name, ','.join(color)))
            mainLayout.addWidget(w)
            self.widgets.append(w)

        self.button = QtGui.QPushButton("Move", self)
        self.button.clicked.connect(self.random_move)

    def random_move(self):
        b = self.button
        parent = b.parent()
        pos = b.pos()
        name = parent and parent.objectName() or "None"
        print "\nOld Parent/Pos: ", name, (pos.x(), pos.y())

        new_parent = parent 
        while new_parent is parent:
            self.widgets.rotate(1)
            new_parent = self.widgets[0]

        self.button.setParent(new_parent)
        self.button.move(randint(0, 50), randint(0, 50))
        pos = b.pos()
        name = new_parent and new_parent.objectName() or "None"
        print "New Parent/Pos: ", name, (pos.x(), pos.y())
        self.button.show()

if __name__ == "__main__":

    app = QtGui.QApplication([])

    w = Widget()
    w.resize(800,600)
    w.show()

    app.exec_()

每次单击该按钮,它都会重新显示为不同的小部件,并使用随机移动。您将获得前一个父级和位置与新父级和位置的打印件。它始终与该父级的左上角相关。

答案 1 :(得分:1)

这取决于小部件是否具有父级。如果是,则坐标相对于父窗口小部件;否则,它们是相对于桌面的。

有关详细信息,请参阅documentation for move()window geometry overview