2

アニメーションのないPythonのシンプルなアプリケーションを実現しました。ここで、信号 (ボタンのクリックなど) によってトリガーされる単純なアニメーションを追加したいと考えています。このアニメーションは、トリガーでウィンドウの幅を拡大し、テキストを含む新しいテキスト領域を表示します。

正直なところ、私は python/pyqt4 にまったく慣れておらず、アニメーション フレームワークについてあまり知りません。

これをクラスコードに追加しようとしました。たとえば、aboutメニューをクリックするというメソッドで:):

  self.anim = QPropertyAnimation(self, "size")
  self.anim.setDuration(2500)
  self.anim.setStartValue(QSize(self.width(), self.height()))
  self.anim.setEndValue(QSize(self.width()+100, self.height()))
  self.anim.start()

これにより、必要に応じてウィンドウが拡大されます。

残念ながら、新しいスペースを埋めるために既に存在するウィジェットを避けて、新しいテキスト領域を挿入する方法がわかりません(実際、ウィンドウが拡大すると、ウィジェットはすべてのスペースを使用するため、自分自身を拡大します)

テキスト領域の外観アニメーションを追加する方法を教えてもらえますか?

どんな助けでも大歓迎です...本当に...

4

1 に答える 1

0

maximumWidthこれを実現する 1 つの方法は、ウィンドウとテキスト編集の両方でプロパティをアニメーション化することです。

主な難点は、ウィンドウのサイズ変更も可能にしながら、標準のレイアウトでうまく機能するようにすることです。アニメーション中のちらつきを避けることも非常にトリッキーです。

次のデモはほぼ完成です (アニメーションは最初と最後で少しぎくしゃくしています)。

from PyQt4 import QtGui, QtCore

class Window(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self._offset = 200
        self._closed = False
        self._maxwidth = self.maximumWidth()
        self.widget = QtGui.QWidget(self)
        self.listbox = QtGui.QListWidget(self.widget)
        self.button = QtGui.QPushButton('Slide', self.widget)
        self.button.clicked.connect(self.handleButton)
        self.editor = QtGui.QTextEdit(self)
        self.editor.setMaximumWidth(self._offset)
        vbox = QtGui.QVBoxLayout(self.widget)
        vbox.setContentsMargins(0, 0, 0, 0)
        vbox.addWidget(self.listbox)
        vbox.addWidget(self.button)
        layout = QtGui.QHBoxLayout(self)
        layout.addWidget(self.widget)
        layout.addWidget(self.editor)
        layout.setSizeConstraint(QtGui.QLayout.SetMinAndMaxSize)
        self.animator = QtCore.QParallelAnimationGroup(self)
        for item in (self, self.editor):
            animation = QtCore.QPropertyAnimation(item, 'maximumWidth')
            animation.setDuration(800)
            animation.setEasingCurve(QtCore.QEasingCurve.OutCubic)
            self.animator.addAnimation(animation)
        self.animator.finished.connect(self.handleFinished)

    def handleButton(self):
        for index in range(self.animator.animationCount()):
            animation = self.animator.animationAt(index)
            width = animation.targetObject().width()
            animation.setStartValue(width)
            if self._closed:
                self.editor.show()
                animation.setEndValue(width + self._offset)
            else:
                animation.setEndValue(width - self._offset)
        self._closed = not self._closed
        self.widget.setMinimumSize(self.widget.size())
        self.layout().setSizeConstraint(QtGui.QLayout.SetFixedSize)
        self.animator.start()

    def handleFinished(self):
        if self._closed:
            self.editor.hide()
        self.layout().setSizeConstraint(QtGui.QLayout.SetMinAndMaxSize)
        self.widget.setMinimumSize(0, 0)
        self.setMaximumWidth(self._maxwidth)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.move(500, 300)
    window.show()
    sys.exit(app.exec_())
于 2012-08-28T19:43:07.633 に答える