PyQt-Animation reduziert die Startbreite auf einen kleineren Wert als den InhaltPython

Python-Programme
Anonymous
 PyQt-Animation reduziert die Startbreite auf einen kleineren Wert als den Inhalt

Post by Anonymous »

Ich habe ein kleines pyQt/pySide-Widget, das nur minimalen Platz auf dem Bildschirm einnehmen muss. Es ist beweglich und sollte beim Klicken (oder in Zukunft beim Bewegen der Maus darüber) zwei Unterwidgets erweitern. Einer nach links und einer nach oben. Zu Beginn sollten diese Widgets nicht sichtbar sein und 0 Platz beanspruchen (sodass Desktop-Platz verfügbar bleibt).
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
Ich gehe davon aus, dass verhindert wird, dass das untergeordnete Widget kleiner wird als sein Inhalt. Ich habe es geschafft, eine Breite von 0 zu erreichen, indem ich MaximumWidth auf 0 gesetzt habe, aber in diesem Fall ist es mir nicht gelungen, die Animation richtig zum Laufen zu bringen
Der folgende Beispielcode mit einem erweiterbaren Widget (

Code: Select all

projectWidget
), der sich beim Klicken auf die Schaltfläche 1 nach links erweitert. Die Erweiterung funktioniert, aber standardmäßig sollte das Widget nicht sichtbar sein (Breite 0) und anschließend entweder auf eine festgelegte Breite oder seine bevorzugte Breite erweitert werden

Code: 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_())

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post