当我在PyQt中使用move(x, y)
函数时,小部件移动到哪个精确坐标?我认为x
和y
是相对于什么的,但是对于什么?
答案 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。