Как для кнопки с анимацией задать определенные координаты и размер в окне?
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())