为什么 QPropertyAnimation 动画不起作用?

Why the QPropertyAnimation animation does not work?

我试图在按下按钮时生成动画,但在 self.frame2 returns 大小为 0:

后它不起作用

这是一个例子:

帧 returns 到 0 后动画不再执行:

from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5 import QtCore
from PyQt5 import uic


class Login(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        uic.loadUi("1.-Login.ui",self)

        #Apariencia de Ventana
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground,True)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)

        #Botones
        self.Ajustes.clicked.connect(self.animaAjustes)


        self.ComboSuc.lineEdit().setAlignment(QtCore.Qt.AlignCenter)



        self.animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
        self.animation.setStartValue(QtCore.QSize(0,0))
        self.animation.setEndValue(QtCore.QSize(145,443))
        self.animation.setDuration(200)
        self.animation.setDirection(QtCore.QAbstractAnimation.Forward)




    def animaAjustes(self):

        if self.frame2.width()!=0:
            self.frame2.setGeometry(0,0,0,0)

        else:

            self.animation.start()



app = QApplication([])
l = Login()
l.show()
app.exec_()

file.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>606</width>
    <height>430</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <property name="styleSheet">
   <string notr="true">background:qlineargradient(spread:pad, x1:0.565, y1:0, x2:0.508475, y2:1, stop:0 rgba(0, 0, 103, 0), stop:1 rgba(255, 255, 255, 0));</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <property name="styleSheet">
    <string notr="true">background:qlineargradient(spread:pad, x1:0.565, y1:0, x2:0.508475, y2:1, stop:0 rgba(0, 0, 103, 0), stop:1 rgba(255, 255, 255, 0));</string>
   </property>
   <widget class="QFrame" name="frame1">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>-10</y>
      <width>481</width>
      <height>441</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">
QFrame#frame1{
background:White;
border:0px;

}</string>
    </property>
    <property name="frameShape">
     <enum>QFrame::StyledPanel</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Raised</enum>
    </property>
    <widget class="QFrame" name="frame3">
     <property name="geometry">
      <rect>
       <x>120</x>
       <y>50</y>
       <width>250</width>
       <height>120</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">background-image:url(src/Logo.png);
background-position:center;
background-repeat:none;</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Raised</enum>
     </property>
    </widget>
    <widget class="QPushButton" name="Ajustes">
     <property name="geometry">
      <rect>
       <x>450</x>
       <y>35</y>
       <width>31</width>
       <height>23</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton#Ajustes{
border:0px;
background:none;
}</string>
     </property>
     <property name="text">
      <string/>
     </property>
     <property name="icon">
      <iconset>
       <normaloff>src/Icons/icons8-settings.png</normaloff>src/Icons/icons8-settings.png</iconset>
     </property>
    </widget>
    <widget class="QPushButton" name="Entrar">
     <property name="geometry">
      <rect>
       <x>200</x>
       <y>260</y>
       <width>81</width>
       <height>23</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">QPushButton#Entrar{
background:qlineargradient(spread:pad, x1:0.514, y1:0, x2:0.508475, y2:1, stop:0 rgba(0, 170, 213, 255), stop:1 rgba(19, 12, 64, 255));
color:white;
}
QPushButton#Entrar:pressed{
background:qlineargradient(spread:pad, x1:0.514, y1:0, x2:0.508475, y2:1, stop:0 rgba(19, 12, 64, 255), stop:0.994318 rgba(0, 170, 213, 255));
}

</string>
     </property>
     <property name="text">
      <string>Entrar</string>
     </property>
    </widget>
    <widget class="QLabel" name="LabelSuc">
     <property name="geometry">
      <rect>
       <x>190</x>
       <y>220</y>
       <width>101</width>
       <height>20</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <pointsize>9</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="styleSheet">
      <string notr="true">QLabel#LabelSuc{
border-bottom:1px solid qlineargradient(spread:pad, x1:0.983051, y1:0.608, x2:0, y2:0.585, stop:0 rgba(255, 255, 255, 0), stop:0.497175 rgba(16, 102, 214, 121), stop:1 rgba(255, 255, 255, 0));
color:#1687A1
}</string>
     </property>
     <property name="text">
      <string>Sucusal</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
    <widget class="QFrame" name="frame">
     <property name="geometry">
      <rect>
       <x>0</x>
       <y>10</y>
       <width>481</width>
       <height>21</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">background:#0584B1;</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Raised</enum>
     </property>
     <widget class="QPushButton" name="BotonClose">
      <property name="geometry">
       <rect>
        <x>456</x>
        <y>-2</y>
        <width>21</width>
        <height>21</height>
       </rect>
      </property>
      <property name="font">
       <font>
        <pointsize>10</pointsize>
        <weight>75</weight>
        <bold>true</bold>
       </font>
      </property>
      <property name="styleSheet">
       <string notr="true">QPushButton#BotonClose{
border:0px;
background:none;
color:white;
}</string>
      </property>
      <property name="text">
       <string>X</string>
      </property>
     </widget>
     <widget class="QLabel" name="label_2">
      <property name="geometry">
       <rect>
        <x>2</x>
        <y>1</y>
        <width>151</width>
        <height>16</height>
       </rect>
      </property>
      <property name="styleSheet">
       <string notr="true">color:white;</string>
      </property>
      <property name="text">
       <string>Exxe-Ventas v3.0 2019.01.01</string>
      </property>
     </widget>
    </widget>
    <widget class="QLabel" name="LabelStatus">
     <property name="geometry">
      <rect>
       <x>0</x>
       <y>424</y>
       <width>481</width>
       <height>16</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">color:white;
background:qlineargradient(spread:pad, x1:1, y1:0.545, x2:0, y2:0.585, stop:0 rgba(184, 21, 21, 57), stop:0.487 rgba(182, 27, 13, 186), stop:1 rgba(184, 21, 21, 57));</string>
     </property>
     <property name="text">
      <string> Satus: Sin Conexion</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
   </widget>
   <widget class="QFrame" name="frame2">
    <property name="geometry">
     <rect>
      <x>480</x>
      <y>0</y>
      <width>0</width>
      <height>443</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">QFrame#frame2{
border:0px;
border:2px solid grey;
background:white;
}</string>
    </property>
    <property name="frameShape">
     <enum>QFrame::StyledPanel</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Raised</enum>
    </property>
    <widget class="QLabel" name="label">
     <property name="geometry">
      <rect>
       <x>-3</x>
       <y>0</y>
       <width>141</width>
       <height>21</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">background:#0584B1;
color:white;</string>
     </property>
     <property name="text">
      <string>Configuración</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
    <widget class="QLabel" name="label_3">
     <property name="geometry">
      <rect>
       <x>30</x>
       <y>30</y>
       <width>61</width>
       <height>16</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">color:grey;</string>
     </property>
     <property name="text">
      <string>Sucursal:</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
    <widget class="QComboBox" name="ComboSuc">
     <property name="geometry">
      <rect>
       <x>30</x>
       <y>60</y>
       <width>69</width>
       <height>22</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">QComboBox#ComboSuc{
background:none;
border:0px;
border-bottom: 1px solid lightblue;
color:#05839C;
}


QComboBox QAbstractItemView
{
    border:0px;
    background:white;
    color: grey;

}
QComboBox#ComboSuc::drop-down
{
     subcontrol-origin: padding;
     subcontrol-position: top right;
     width: 15px;
     color: white;
     border-left-width: 0px;
     border-left-color: darkgray;
     border-left-style: solid; /* just a single line */
     border-top-right-radius: 3px; /* same radius as the QComboBox */
     border-bottom-right-radius: 3px;
     padding-left: 10px;
 }</string>
     </property>
     <property name="editable">
      <bool>true</bool>
     </property>
     <item>
      <property name="text">
       <string>Exxe 1</string>
      </property>
     </item>
     <item>
      <property name="text">
       <string>Exxe 3</string>
      </property>
     </item>
    </widget>
   </widget>
   <zorder>frame2</zorder>
   <zorder>frame1</zorder>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

几何是小部件相对于父级的位置,在初始情况下,几何是 (480, 0, 0, 443),即它的宽度为 0,但它位于右边缘frame1 并在将其设置为 geometry (0 , 0, 0, 0) 后将其移动到 window 的左上角位置并应用动画但您看不到为什么它在 frame1 后面。

为了更好地观察错误,使用 raise_ 使框架位于所有错误之上。

def animaAjustes(self):
    if self.frame2.width() != 0:
        self.frame2.setGeometry(0, 0, 0, 0)
    else:
        self.frame2.raise_() # <--- this change will make the error visible
        self.animation.start()

解决方案只改变尺寸,不改变几何(几何是位置+尺寸):

def animaAjustes(self):
    if self.frame2.width() > 0:
        self.frame2.resize(0, 0)
    else:
        self.animation.start()