Мне удалось заставить анимацию работать с минимальным мерцанием (сначала увеличив размер окна, а затем запустив анимацию).
Мне не удается получить начальную ширину расширяющихся зон, равную 0. Я попробовал:
- подклассифицировать QWidget для расширяемого виджета и перезаписать sizeHint: не уменьшил размер и не испортил анимацию
- с помощью .resize для дочернего виджета: ничего не делал
- перезаписывая метод showEvent для основного виджета и меняя геометрию вручную. Ничего не делал
Ниже приведен пример кода с одним расширяемым виджетом (projectWidget), который расширяется влево при нажатии кнопки 1. Расширение работает, но по умолчанию виджет не должен быть видимым (ширина 0), а затем расширяться до заданной или предпочтительной ширины
import sys
from PySide6.QtCore import Qt, Signal, QPropertyAnimation, QSize, QPoint
from PySide6.QtWidgets import (
QApplication, QWidget, QPushButton, QLabel, QHBoxLayout,
QVBoxLayout, QGridLayout, QSizePolicy
)
class PMQuickAccess(QWidget):
def __init__(self):
super().__init__()
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.layout = QGridLayout()
self.layout.setSpacing(0)
self.initialMainQRect = None
### PROJECTWIDGET
self.projectWidget = QWidget(self)
self.projectWidgetLayout = QVBoxLayout()
label = QLabel('MyText', self.projectWidget)
self.projectWidgetLayout.addWidget(label)
self.layout.addWidget(self.projectWidget, 0, 0)
self.projectWidget.setLayout(self.projectWidgetLayout)
self.projectWidget.setSizePolicy(
QSizePolicy.Expanding, QSizePolicy.Expanding
)
p = self.projectWidget.palette()
p.setColor(self.projectWidget.backgroundRole(), Qt.red)
self.projectWidget.setAutoFillBackground(True)
self.projectWidget.setPalette(p)
### BTNWIDGET
self.btnWidget = QWidget(self)
self.btnWidgetLayout = QHBoxLayout()
self.btnWidgetLayout.setSpacing(0)
self.btnWidgetLayout.setContentsMargins(0, 0, 0, 0)
self.btn1 = QPushButton("&1", self.btnWidget)
self.btn1.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
self.btn1.setFixedWidth(40)
self.btn1.setFixedHeight(50)
self.btn2 = QPushButton("&2", self.btnWidget)
self.btn2.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
self.btn2.setFixedWidth(40)
self.btn2.setFixedHeight(50)
self.btn1.clicked.connect(self.animatedResize)
self.btnWidgetLayout.addWidget(self.btn1)
self.btnWidgetLayout.addWidget(self.btn2)
self.btnWidget.setLayout(self.btnWidgetLayout)
self.btnWidget.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
self.layout.addWidget(self.btnWidget, 0, 1)
self.setLayout(self.layout)
print(self.projectWidget.geometry())
def animatedResize(self):
if not self.initialMainQRect:
self.initialMainQRect = self.geometry()
projQRect = self.projectWidget.geometry()
mainQRect = self.geometry()
margin = 200
self.animationProject = QPropertyAnimation(
self.projectWidget, b"geometry"
)
self.animationProject.setDuration(1000)
if mainQRect.width() == self.initialMainQRect.width():
mainQRect.setWidth = mainQRect.width() + margin
mainQRect.setX(mainQRect.x() - margin)
self.setGeometry(mainQRect)
x_initial = projQRect.x()
x1 = projQRect.x() + margin
x2 = x1 + projQRect.width()
y1 = projQRect.y()
y2 = y1 + projQRect.height()
projQRect.setCoords(x1, y1, x2, y2)
self.projectWidget.setGeometry(projQRect)
projQRect.setCoords(x_initial, y1, x2, y2)
self.animationProject.setEndValue(projQRect)
self.animationProject.start()
else:
mainQRect.setWidth = mainQRect.width() - margin
mainQRect.setX(mainQRect.x() + margin)
self.setGeometry(mainQRect)
self.initialMainQRect = self.geometry()
def mousePressEvent(self, event):
self.oldPos = event.globalPosition().toPoint()
def mouseMoveEvent(self, event):
delta = QPoint (event.globalPosition().toPoint() - self.oldPos)
self.move(self.x() + delta.x(), self.y() + delta.y())
self.oldPos = event.globalPosition().toPoint()
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
z = PMQuickAccess()
z.show()
sys.exit(app.exec_())
Подробнее здесь: https://stackoverflow.com/questions/798 ... an-content
Мобильная версия