View difference between Paste ID: a04tvY0U and wrUX5Ce0
SHOW: | | - or go back to the newest paste.
1
import sys
2
from PySide.QtCore import *
3
from PySide.QtGui import *
4-
4+
 
5
class TestFrame( QFrame ):
6-
    def __init__( self, parent=None ):
6+
    def __init__( self, area, parent=None ):
7
        super( TestFrame, self ).__init__( parent )
8
        self.setFrameStyle( QFrame.StyledPanel )
9-
        self.setSizePolicy( parent.sizePolicy() ) # THIS DOESN'T SEEM TO HAVE ANY EFFECT
9+
        self.area = area
10-
10+
        self.frame_height = self.height()
11-
class SliderWidget( QWidget ):
11+
12
    def setHeight(self, height):
13
        self.frame_height = height
14
        
15
    def resetGeometry(self, size):
16
        height = self.frame_height
17
        
18-
18+
        x = 0
19
        width = size.width()
20
        
21
        if self.area == Qt.TopDockWidgetArea:
22
            y = 0
23-
        self.frameCentre = TestFrame( self )
23+
            
24-
        self.frameTop = TestFrame( self.frameCentre )
24+
        elif self.area == Qt.BottomDockWidgetArea:
25-
        self.frameBottom = TestFrame( self.frameCentre )
25+
            y = size.height() - height
26
            
27-
27+
        super(TestFrame, self).setGeometry(x, y, width, height)
28-
        # TOOLTIPS 
28+
29
class CentralFrame(QFrame):
30
    
31
    resized = Signal(QSize)
32-
32+
33
    def resizeEvent(self, event):
34
        assert isinstance(event, QResizeEvent)
35
        
36-
        # RESIZE AND REPO TOP AND BOTTOM FRAMES
36+
        self.resized.emit(event.size())
37-
        # THIS IS WHERE I HAVE TROUBLE TO SET THE RIGHT SIZE AND POSITION
37+
 
38-
        # I'VE SET ABSOLUTE POSITION AND SCALE JUST TO ILLUSTRATE WHAT I'M AFTER.
38+
class SliderWidget(QMainWindow):
39-
        # THIS REALLY NEEDS TO BE LINKED TO THE PARENT SO THE TOP AND BOTOM FRAMES ARE ALWAYS THE SAME WIDTH
39+
40-
        # AND HAVE THE SAME SIZE POLICY AS THE MIDDLE FRAME
40+
41-
        self.frameTop.setGeometry( 0, 0, 800, 100 )
41+
42-
        self.frameBottom.setGeometry( 0, 600, 800, 100 )
42+
       
43-
43+
44
        self.setLayout( QGridLayout() )
45-
        #self.frameTop.hide()
45+
 
46-
        #self.frameBottom.hide()
46+
47
        self.animGroup = QParallelAnimationGroup()
48
       
49-
        self.layout().addWidget( self.frameCentre )
49+
50-
        self.layout().addWidget( self.btn )
50+
        self.frameCentre = CentralFrame( self )
51-
51+
        self.frameTop = TestFrame( Qt.TopDockWidgetArea, self.frameCentre )
52-
52+
        self.frameBottom = TestFrame( Qt.BottomDockWidgetArea, self.frameCentre )
53
        self.frameCentre.resized.connect(self.frameTop.resetGeometry)
54
        self.frameCentre.resized.connect(self.frameBottom.resetGeometry)
55
        self.btn = QPushButton( 'GO' )
56
        
57
        self.frameTop.setHeight(200)
58-
58+
        self.frameBottom.setHeight(200)
59
        self.frameCentre.setMinimumHeight(500)
60
 
61
        # TOOLTIPS
62
        self.frameTop.setToolTip( 'frame top' )
63
        self.frameCentre.setToolTip( 'frame centre' )
64-
            start = -1000
64+
65
 
66
        # SLIDE IN TOP AND BOTTOM FRAMES
67-
            start = 900
67+
68-
            end = 600
68+
 
69-
69+
70
        self.frameTop.hide()
71
        self.frameBottom.hide()
72
       
73
        # ADD CENTRETO LAYOUT
74-
74+
        self.setCentralWidget(self.frameCentre)
75
        layout = QVBoxLayout(self.frameCentre)
76
        layout.addWidget(self.btn)
77
        self.frameCentre.setLayout(layout)
78
 
79
 
80
    def moveWidgets( self ):
81
        '''trigger animations'''
82
        self.animGroup.clear()
83-
83+
84
        self.slideInWidget( self.frameBottom, 'bottomUp')
85-
85+
86
 
87
    def slideInWidget( self, widget, direction ):
88
        '''assign animation to frames'''
89
        assert direction in ( 'topDown', 'bottomUp' )
90
        # DEFINE START AND END POSITION - THIS IS WHERE I HAVE TROUBLE SETTING THE RIGHT POSITION
91
        if direction == 'topDown':
92
            start = widget.height() * -1
93
            end = 0
94
        elif direction == 'bottomUp':
95
            start = self.centralWidget().height()
96
            end = self.centralWidget().height() - widget.height()
97
 
98
        # START ANIMATION
99
        widget.show()
100
        slideInAnim = self.slideAnimation( widget, start, end )
101
        self.animGroup.addAnimation( slideInAnim )
102
 
103
    def slideAnimation( self, widget, start, end ):
104
        '''Define sliding animation'''
105
        slideAnimation = QPropertyAnimation( widget, 'pos' )
106
        slideAnimation.setDuration( 1000 )
107
        slideAnimation.setStartValue( QPoint( widget.pos().x(), start ) )
108
        slideAnimation.setEndValue( QPoint( widget.pos().x(), end ) )
109
        slideAnimation.setEasingCurve( QEasingCurve.OutCubic )
110
        return slideAnimation
111
 
112
if __name__ == "__main__":
113
 
114
    app = QApplication(sys.argv)  
115
    sw = SliderWidget()
116
   
117
    sw.resize( 800, 750 )
118
    sw.show()
119
   
120
    sys.exit(app.exec_())