Анимация pyQt уменьшает начальную ширину до меньшего, чем содержимоеPython

Программы на Python
Ответить
Anonymous
 Анимация pyQt уменьшает начальную ширину до меньшего, чем содержимое

Сообщение Anonymous »

У меня есть небольшой виджет pyQt/pySide, который должен занимать минимум места на экране. Он подвижен и при нажатии (или в будущем при наведении курсора) должен развернуть 2 подвиджета. Один слева и один вверху. Вначале эти виджеты не должны быть видимыми и занимать 0 места (так, чтобы место на рабочем столе оставалось доступным).
Мне удалось заставить анимацию работать с минимальным мерцанием (сначала увеличив размер окна, а затем запустив анимацию).
Мне не удается получить начальную ширину расширяющихся зон, равную 0. Я попробовал:
  • подклассифицировать QWidget для расширяемого виджета и перезаписать sizeHint: не уменьшил размер и не испортил анимацию
  • с помощью .resize для дочернего виджета: ничего не делал
  • перезаписывая метод showEvent для основного виджета и меняя геометрию вручную. Ничего не делал
Я предполагаю, что дочерний виджет не станет меньше своего содержимого. Мне удалось получить нулевую ширину, установив для maxWidth значение 0, но в этом случае мне не удалось добиться правильной работы анимации.
Ниже приведен пример кода с одним расширяемым виджетом (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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»