Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- from PySide.QtCore import *
- from PySide.QtGui import *
- class TestFrame( QFrame ):
- def __init__( self, area, parent=None ):
- super( TestFrame, self ).__init__( parent )
- self.setFrameStyle( QFrame.StyledPanel )
- self.area = area
- self.frame_height = self.height()
- def setHeight(self, height):
- self.frame_height = height
- def resetGeometry(self, size):
- height = self.frame_height
- x = 0
- width = size.width()
- if self.area == Qt.TopDockWidgetArea:
- y = 0
- elif self.area == Qt.BottomDockWidgetArea:
- y = size.height() - height
- super(TestFrame, self).setGeometry(x, y, width, height)
- class CentralFrame(QFrame):
- resized = Signal(QSize)
- def resizeEvent(self, event):
- assert isinstance(event, QResizeEvent)
- self.resized.emit(event.size())
- class SliderWidget(QMainWindow):
- def __init__( self ):
- super( SliderWidget, self ).__init__()
- self.buildUI()
- def buildUI( self ):
- self.setLayout( QGridLayout() )
- # ANIMATION GROUP FOR TOP AND BOTTOM FRAMES
- self.animGroup = QParallelAnimationGroup()
- # CREATE WIDGETS
- self.frameCentre = CentralFrame( self )
- self.frameTop = TestFrame( Qt.TopDockWidgetArea, self.frameCentre )
- self.frameBottom = TestFrame( Qt.BottomDockWidgetArea, self.frameCentre )
- self.frameCentre.resized.connect(self.frameTop.resetGeometry)
- self.frameCentre.resized.connect(self.frameBottom.resetGeometry)
- self.btn = QPushButton( 'GO' )
- self.frameTop.setHeight(200)
- self.frameBottom.setHeight(200)
- self.frameCentre.setMinimumHeight(500)
- # TOOLTIPS
- self.frameTop.setToolTip( 'frame top' )
- self.frameCentre.setToolTip( 'frame centre' )
- self.frameBottom.setToolTip( 'frame bottom' )
- # SLIDE IN TOP AND BOTTOM FRAMES
- self.btn.clicked.connect( self.moveWidgets )
- # HIDE TOP AND BOTTOM AT FIRST - DEACTIVATE FOR DEBUGGING
- self.frameTop.hide()
- self.frameBottom.hide()
- # ADD CENTRETO LAYOUT
- self.setCentralWidget(self.frameCentre)
- layout = QVBoxLayout(self.frameCentre)
- layout.addWidget(self.btn)
- self.frameCentre.setLayout(layout)
- def moveWidgets( self ):
- '''trigger animations'''
- self.animGroup.clear()
- self.slideInWidget( self.frameTop, 'topDown' )
- self.slideInWidget( self.frameBottom, 'bottomUp')
- self.animGroup.start()
- def slideInWidget( self, widget, direction ):
- '''assign animation to frames'''
- assert direction in ( 'topDown', 'bottomUp' )
- # DEFINE START AND END POSITION - THIS IS WHERE I HAVE TROUBLE SETTING THE RIGHT POSITION
- if direction == 'topDown':
- start = widget.height() * -1
- end = 0
- elif direction == 'bottomUp':
- start = self.centralWidget().height()
- end = self.centralWidget().height() - widget.height()
- # START ANIMATION
- widget.show()
- slideInAnim = self.slideAnimation( widget, start, end )
- self.animGroup.addAnimation( slideInAnim )
- def slideAnimation( self, widget, start, end ):
- '''Define sliding animation'''
- slideAnimation = QPropertyAnimation( widget, 'pos' )
- slideAnimation.setDuration( 1000 )
- slideAnimation.setStartValue( QPoint( widget.pos().x(), start ) )
- slideAnimation.setEndValue( QPoint( widget.pos().x(), end ) )
- slideAnimation.setEasingCurve( QEasingCurve.OutCubic )
- return slideAnimation
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- sw = SliderWidget()
- sw.resize( 800, 750 )
- sw.show()
- sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement