Ich habe es geschafft, die Animation mit minimalem Flackern zum Laufen zu bringen (indem ich zuerst die Fenstergröße erhöht und dann die Animation gestartet habe).
Ich schaffe es nicht, die Startbreite der Erweiterungszonen auf 0 zu bringen. Ich habe es versucht:
- QWidget für das erweiterbare Widget in eine Unterklasse umwandeln und sizeHint überschreiben: habe die Größe nicht reduziert und die Animation durcheinander gebracht
- mit .resize für das untergeordnete Widget: Nichts gemacht
- die showEvent-Methode für das Haupt-Widget überschrieben und die Geometrie manuell geändert. Hat nichts getan
Der folgende Beispielcode mit einem erweiterbaren Widget (
Code: Select all
projectWidgetCode: Select all
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_())
Mobile version