Как для кнопки с анимацией задать определенные координаты и размер в окне?

noname.py:

from PyQt5 import QtCore, QtGui, QtWidgets
from b import FlyButton


class Ui_MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi()

    def setupUi(self):
        self.setObjectName("self")
        self.resize(612, 427)
    
        self.pusButton = FlyButton()
        self.pusButton.setGeometry(QtCore.QRect(270, 192, 51, 41))
        self.pusButton.setText("")
        self.pusButton.setObjectName("pusButton")
        self.setCentralWidget(self.pusButton)
        self.statusbar = QtWidgets.QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

Вот, есть некий код, который создает кнопку с какой-то анимацией, а кнопка должна находиться на НУЖНОМ месте, а не на всё окно.
(Это сгенерированный код при помощи PyQt5 UI code generator 5.15.9. Я пытался не трогать этот сгенерированный код, а в другом файле присваивать FlyButton() к self.pusButton, но оно не работало.
Не понимаю, почему? Я бы просто хотел узнать как сделать так, чтобы оно было не на все окно?)


b.py:

from PyQt5.QtWidgets import QPushButton
from PyQt5.QtCore import QPropertyAnimation, QEasingCurve
from PyQt5 import QtCore 


class FlyButton(QPushButton):
    def __init__(self, *args, **kwargs):
        super().__init__()
        self.animation = QPropertyAnimation(self, b'size')
        self.animation.setDuration(2000)
        self.animation.setEasingCurve(QEasingCurve.OutInElastic)

    def enterEvent(self, event):
        self.animation.setStartValue(self.size())    
        self.animation.setEndValue(QtCore.QSize(300, 250,))

        self.animation.start()
        QPushButton.enterEvent(self, event)
        print('работает')

А вот сам ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>612</width>
    <height>427</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>270</x>
      <y>192</y>
      <width>51</width>
      <height>41</height>
     </rect>
    </property>
    <property name="text">
     <string/>
    </property>
   </widget>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Ответы (1 шт):

Автор решения: S. Nick

Я не уверен, что правильно понял вас.
Я думаю, что вас надо делать анимацию geometry вместо size.
На всякий случай, нажмите ПКМ на кнопке и перетащите ее куда-нибудь, если вам так надо будет сделать.

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class FlyButton(QPushButton):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setObjectName("flyButton")        
        self.setCheckable(True)                     
        self.resize(200, 150)
        self.move(125, 125)

    def mousePressEvent(self, event):
        if event.button() == Qt.RightButton:
            self.origin = event.pos()
        super().mousePressEvent(event)
        
    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.RightButton:
            self.move(event.windowPos().toPoint() - self.origin)
        super().mouseMoveEvent(event)
    

class Ui_MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi()

    def setupUi(self):
        self.setObjectName("self")
        self.resize(612, 427)
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget) 
    
        self.flyButton = FlyButton(self, text='Cжимать')
        self.flyButton.clicked.connect(self.btn_clicked)
        
    def btn_clicked(self, state):
        if state:
            self.reduce()
            QTimer.singleShot(1000, lambda: self.flyButton.setText('Развернуть'))   
        else:
            self.increase()
            QTimer.singleShot(1000, lambda: self.flyButton.setText('Cжимать'))

    def increase(self):
        rect_start = QRect(self.flyButton.geometry())
        rect_end = QRect(0, 0, 200, 150)
        rect_end.moveCenter(rect_start.center())
        animation = QPropertyAnimation(self.flyButton, b"geometry", self)
        animation.setStartValue(rect_start)
        animation.setEndValue(rect_end)
        animation.setDuration(1000)
        animation.start(QAbstractAnimation.DeleteWhenStopped)

    def reduce(self):
        rect_start = QRect(self.flyButton.geometry())
        rect_end = QRect(0, 0, 100, 50)
        rect_end.moveCenter(rect_start.center())        
        animation = QPropertyAnimation(self.flyButton, b"geometry", self)
        animation.setStartValue(rect_start)
        animation.setEndValue(rect_end)
        animation.setDuration(1000)
        animation.start(QAbstractAnimation.DeleteWhenStopped)
            

if __name__ == "__main__":
    import sys
    
    app = QtWidgets.QApplication(sys.argv)
    w = Ui_MainWindow()
    w.resize(612, 427)
    w.show()
    sys.exit(app.exec())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка