0

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

4

2 回答 2

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_()

每次您单击该按钮时,它都会重新指向不同的小部件,并使用随机移动。您将打印出以前的父级和位置与新的父级和位置。它将始终相对于该父级的左上角

于 2012-09-05T20:41:49.677 回答
1

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

有关更多详细信息,请参阅 的文档move()窗口几何概述

于 2012-09-05T18:54:48.050 回答