<p>小部件的位置是相对于其父部件的,因此不应使用<code>startpoint = self.mapToGlobal(self.pos())</code>,而应使用<code>startpoint = self.mapToGlobal(QPoint())</code>,因为对于小部件,左上角的位置是<code>QPoint(0, 0)</code>。你知道吗</p>
<p>因此,如果要使用<a href="https://stackoverflow.com/users/4607234/magrif">@magrif</a>解决方案,应该将其更改为:</p>
<pre class="lang-py prettyprint-override"><code>def animate(self):
startpoint = self.mapToGlobal(QPoint())
self.setWindowFlags(Qt.Popup)
self.show()
anim = QPropertyAnimation(
self,
b"pos",
self,
duration=3000,
startValue=startpoint,
endValue=startpoint + QPoint(200, -20),
finished=self.deleteLater,
)
anim.start()
</code></pre>
<p>但缺点是,当动画运行时,不能与窗口交互。你知道吗</p>
<p>另一种解决方案是将QFrame的父级更改为窗口本身:</p>
<pre class="lang-py prettyprint-override"><code>def animate(self):
startpoint = self.window().mapFromGlobal(self.mapToGlobal(QPoint()))
self.setParent(self.window())
anim = QPropertyAnimation(
self,
b"pos",
self,
duration=3000,
startValue=startpoint,
endValue=startpoint + QPoint(200, -20),
finished=self.deleteLater,
)
anim.start()
self.show()
</code></pre>
<p>注意:不需要创建qproperty位置,因为qproperty<a href="https://doc.qt.io/qt-5/qwidget.html#pos-prop" rel="nofollow noreferrer">pos</a>已经存在。你知道吗</p>