Don't like ads? PRO users don't see any ads ;-)
Guest

PyQt collapsible GroupBox

By: a guest on May 14th, 2012  |  syntax: Python  |  size: 17.36 KB  |  hits: 248  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. '''PyQt collapsible GroupBox
  2.  
  3. http://code.google.com/p/blur-dev/
  4. '''
  5.  
  6. ##
  7. #       \namespace      blurdev.gui.widgets.accordianwidget.accordianitem
  8. #
  9. #       \remarks        The container class for a widget that is collapsible within the accordian widget system
  10. #
  11. #       \author         beta@blur.com
  12. #       \author         Blur Studio
  13. #       \date           04/29/10
  14. #
  15. #
  16.  
  17. from PyQt4.QtGui        import QGroupBox
  18.  
  19. class AccordianItem( QGroupBox ):
  20.         def __init__( self, accordian, title, widget ):
  21.                 QGroupBox.__init__( self, accordian )
  22.  
  23.                 # create the layout
  24.                 from PyQt4.QtCore import Qt
  25.                 from PyQt4.QtGui import QVBoxLayout
  26.  
  27.                 layout = QVBoxLayout()
  28.                 layout.setContentsMargins( 6, 6, 6, 6 )
  29.                 layout.setSpacing( 0 )
  30.                 layout.addWidget( widget )
  31.  
  32.                 self._accordianWidget = accordian
  33.                 self._rolloutStyle = 2
  34.                 self._dragDropMode = 0
  35.  
  36.                 self.setAcceptDrops(True)
  37.                 self.setLayout( layout )
  38.                 self.setContextMenuPolicy( Qt.CustomContextMenu )
  39.                 self.customContextMenuRequested.connect( self.showMenu )
  40.  
  41.                 # create custom properties
  42.                 self._widget            = widget
  43.                 self._collapsed         = False
  44.                 self._collapsible       = True
  45.                 self._clicked           = False
  46.                 self._customData        = {}
  47.  
  48.                 from PyQt4.QtGui import QPixmap
  49.                 import os.path
  50.                 self._pixmap = QPixmap( os.path.split( __file__ )[0] + '/img/triangle.png' )
  51.  
  52.                 # set common properties
  53.                 self.setTitle( title )
  54.  
  55.         def accordianWidget( self ):
  56.                 """
  57.                         \remarks        grabs the parent item for the accordian widget
  58.                         \return         <blurdev.gui.widgets.accordianwidget.AccordianWidget>
  59.                 """
  60.                 return self._accordianWidget
  61.  
  62.         def customData( self, key, default = None ):
  63.                 """
  64.                         \remarks        return a custom pointer to information stored with this item
  65.                         \param          key                     <str>
  66.                         \param          default         <variant>       default value to return if the key was not found
  67.                         \return         <variant> data
  68.                 """
  69.                 return self._customData.get( str(key), default )
  70.  
  71.         def dragEnterEvent( self, event ):
  72.                 if ( not self._dragDropMode ):
  73.                         return
  74.  
  75.                 source = event.source()
  76.                 if ( source != self and source.parent() == self.parent() and isinstance( source, AccordianItem ) ):
  77.                         event.acceptProposedAction()
  78.  
  79.         def dragDropRect( self ):
  80.                 from PyQt4.QtCore import QRect
  81.                 return QRect( 25, 7, 10, 6 )
  82.  
  83.         def dragDropMode( self ):
  84.                 return self._dragDropMode
  85.  
  86.         def dragMoveEvent( self, event ):
  87.                 if ( not self._dragDropMode ):
  88.                         return
  89.  
  90.                 source = event.source()
  91.                 if ( source != self and source.parent() == self.parent() and isinstance( source, AccordianItem ) ):
  92.                         event.acceptProposedAction()
  93.  
  94.         def dropEvent( self, event ):
  95.                 widget = event.source()
  96.                 layout = self.parent().layout()
  97.                 layout.insertWidget( layout.indexOf(self), widget )
  98.                 self._accordianWidget.emitItemsReordered()
  99.  
  100.         def expandCollapseRect( self ):
  101.                 from PyQt4.QtCore import QRect
  102.                 return QRect( 0, 0, self.width(), 20 )
  103.  
  104.         def enterEvent( self, event ):
  105.                 self.accordianWidget().leaveEvent( event )
  106.                 event.accept()
  107.  
  108.         def leaveEvent( self, event ):
  109.                 self.accordianWidget().enterEvent( event )
  110.                 event.accept()
  111.  
  112.         def mouseReleaseEvent( self, event ):
  113.                 if ( self._clicked and self.expandCollapseRect().contains( event.pos() ) ):
  114.                         self.toggleCollapsed()
  115.                         event.accept()
  116.                 else:
  117.                         event.ignore()
  118.  
  119.                 self._clicked = False
  120.  
  121.         def mouseMoveEvent( self, event ):
  122.                 event.ignore()
  123.  
  124.         def mousePressEvent( self, event ):
  125.                 # handle an internal move
  126.                 from PyQt4.QtCore import Qt
  127.  
  128.                 # start a drag event
  129.                 if ( event.button() == Qt.LeftButton and self.dragDropRect().contains( event.pos() ) ):
  130.                         from PyQt4.QtCore import QMimeData
  131.                         from PyQt4.QtGui import QDrag, QPixmap
  132.  
  133.                         # create the pixmap
  134.                         pixmap = QPixmap.grabWidget( self, self.rect() )
  135.  
  136.                         # create the mimedata
  137.                         mimeData = QMimeData()
  138.                         mimeData.setText( 'ItemTitle::%s' % (self.title()) )
  139.  
  140.                         # create the drag
  141.                         drag = QDrag(self)
  142.                         drag.setMimeData( mimeData )
  143.                         drag.setPixmap( pixmap )
  144.                         drag.setHotSpot( event.pos() )
  145.  
  146.                         if ( not drag.exec_() ):
  147.                                 self._accordianWidget.emitItemDragFailed(self)
  148.  
  149.                         event.accept()
  150.  
  151.                 # determine if the expand/collapse should occur
  152.                 elif ( event.button() == Qt.LeftButton and self.expandCollapseRect().contains( event.pos() ) ):
  153.                         self._clicked = True
  154.                         event.accept()
  155.  
  156.                 else:
  157.                         event.ignore()
  158.  
  159.         def isCollapsed( self ):
  160.                 return self._collapsed
  161.  
  162.         def isCollapsible( self ):
  163.                 return self._collapsible
  164.  
  165.         def paintEvent( self, event ):
  166.                 from PyQt4.QtCore       import Qt
  167.                 from PyQt4.QtGui        import QPainter, QPainterPath, QPalette, QPixmap, QPen
  168.  
  169.                 painter = QPainter()
  170.                 painter.begin( self )
  171.                 painter.setRenderHint( painter.Antialiasing )
  172.  
  173.                 x = self.rect().x()
  174.                 y = self.rect().y()
  175.                 w = self.rect().width() - 1
  176.                 h = self.rect().height() - 1
  177.                 r = 8
  178.  
  179.                 # draw a rounded style
  180.                 if ( self._rolloutStyle == 2 ):
  181.  
  182.                         # draw the text
  183.                         painter.drawText( x + 22, y + 3, w, 16, Qt.AlignLeft | Qt.AlignTop, self.title() )
  184.  
  185.                         # draw the triangle
  186.                         pixmap = self._pixmap
  187.                         if ( not self.isCollapsed() ):
  188.                                 from PyQt4.QtGui import QMatrix
  189.                                 pixmap = pixmap.transformed( QMatrix().rotate(90) )
  190.  
  191.                         painter.drawPixmap( x + 7, y + 4, pixmap )
  192.  
  193.                         # draw the borders
  194.                         pen = QPen( self.palette().color( QPalette.Light ) )
  195.                         pen.setWidthF( 0.6 )
  196.                         painter.setPen( pen )
  197.  
  198.                         painter.drawRoundedRect( x + 1, y + 1, w - 1, h - 1, r, r )
  199.  
  200.                         pen.setColor( self.palette().color( QPalette.Shadow ) )
  201.                         painter.setPen( pen )
  202.  
  203.                         painter.drawRoundedRect( x, y, w - 1, h - 1, r, r )
  204.  
  205.                 # draw a boxed style
  206.                 elif ( self._rolloutStyle == 1 ):
  207.                         from PyQt4.QtCore import QRect
  208.                         if ( self.isCollapsed() ):
  209.                                 arect   = QRect( x + 1, y + 9, w - 1, 4 )
  210.                                 brect   = QRect( x, y + 8, w - 1, 4 )
  211.                                 text    = '+'
  212.                         else:
  213.                                 arect   = QRect( x + 1, y + 9, w - 1, h - 9 )
  214.                                 brect   = QRect( x, y + 8, w - 1, h - 9 )
  215.                                 text    = '-'
  216.  
  217.                         # draw the borders
  218.                         pen = QPen( self.palette().color( QPalette.Light ) )
  219.                         pen.setWidthF( 0.6 )
  220.                         painter.setPen( pen )
  221.  
  222.                         painter.drawRect( arect )
  223.  
  224.                         pen.setColor( self.palette().color( QPalette.Shadow ) )
  225.                         painter.setPen( pen )
  226.  
  227.                         painter.drawRect( brect )
  228.  
  229.                         painter.setRenderHint( painter.Antialiasing, False )
  230.                         painter.setBrush( self.palette().color( QPalette.Window ).darker( 120 ) )
  231.                         painter.drawRect( x + 10, y + 1, w - 20, 16 )
  232.                         painter.drawText( x + 16, y + 1, w - 32, 16, Qt.AlignLeft | Qt.AlignVCenter, text )
  233.                         painter.drawText( x + 10, y + 1, w - 20, 16, Qt.AlignCenter, self.title() )
  234.  
  235.                 if ( self.dragDropMode() ):
  236.                         rect    = self.dragDropRect()
  237.  
  238.                         # draw the lines
  239.                         l               = rect.left()
  240.                         r               = rect.right()
  241.                         cy              = rect.center().y()
  242.  
  243.                         for y in (cy - 3, cy, cy + 3):
  244.                                 painter.drawLine( l, y, r, y )
  245.  
  246.                 painter.end()
  247.  
  248.         def setCollapsed( self, state = True ):
  249.                 if ( self.isCollapsible() ):
  250.                         accord = self.accordianWidget()
  251.                         accord.setUpdatesEnabled(False)
  252.  
  253.                         self._collapsed = state
  254.  
  255.                         if ( state ):
  256.                                 self.setMinimumHeight( 22 )
  257.                                 self.setMaximumHeight( 22 )
  258.                                 self.widget().setVisible( False )
  259.                         else:
  260.                                 self.setMinimumHeight( 0 )
  261.                                 self.setMaximumHeight( 1000000 )
  262.                                 self.widget().setVisible( True )
  263.  
  264.                         self._accordianWidget.emitItemCollapsed( self )
  265.                         accord.setUpdatesEnabled(True)
  266.  
  267.         def setCollapsible( self, state = True ):
  268.                 self._collapsible = state
  269.  
  270.         def setCustomData( self, key, value ):
  271.                 """
  272.                         \remarks        set a custom pointer to information stored on this item
  273.                         \param          key             <str>
  274.                         \param          value   <variant>
  275.                 """
  276.                 self._customData[ str(key) ] = value
  277.  
  278.         def setDragDropMode( self, mode ):
  279.                 self._dragDropMode = mode
  280.  
  281.         def setRolloutStyle( self, style ):
  282.                 self._rolloutStyle = style
  283.  
  284.         def showMenu( self ):
  285.                 from PyQt4.QtCore import QRect
  286.                 from PyQt4.QtGui import QCursor
  287.                 if ( QRect( 0, 0, self.width(), 20 ).contains( self.mapFromGlobal( QCursor.pos() ) ) ):
  288.                         self._accordianWidget.emitItemMenuRequested( self )
  289.  
  290.         def rolloutStyle( self ):
  291.                 return self._rolloutStyle
  292.  
  293.         def toggleCollapsed( self ):
  294.                 self.setCollapsed( not self.isCollapsed() )
  295.  
  296.         def widget( self ):
  297.                 return self._widget
  298.  
  299. ##
  300. #       \namespace      trax.gui.widgets.accordianwidget
  301. #
  302. #       \remarks        A container widget for creating expandable and collapsible components
  303. #
  304. #       \author         beta@blur.com
  305. #       \author         Blur Studio
  306. #       \date           04/29/10
  307. #
  308. #
  309.  
  310. from PyQt4.QtCore       import pyqtSignal, pyqtProperty
  311. from PyQt4.QtGui        import QScrollArea
  312. #from accordianitem     import AccordianItem
  313.  
  314. class AccordianWidget( QScrollArea ):
  315.         itemCollapsed           = pyqtSignal(AccordianItem)
  316.         itemMenuRequested       = pyqtSignal(AccordianItem)
  317.         itemDragFailed          = pyqtSignal(AccordianItem)
  318.         itemsReordered          = pyqtSignal()
  319.  
  320.         Boxed           = 1
  321.         Rounded         = 2
  322.  
  323.         NoDragDrop              = 0
  324.         InternalMove    = 1
  325.  
  326.         def __init__( self, parent ):
  327.                 QScrollArea.__init__( self, parent )
  328.  
  329.                 self.setFrameShape( QScrollArea.NoFrame )
  330.                 self.setAutoFillBackground( False )
  331.                 self.setWidgetResizable( True )
  332.                 self.setMouseTracking(True)
  333.                 self.verticalScrollBar().setMaximumWidth(10)
  334.  
  335.                 from PyQt4.QtGui import QWidget
  336.                 widget = QWidget( self )
  337.  
  338.                 # define custom properties
  339.                 self._rolloutStyle      = AccordianWidget.Rounded
  340.                 self._dragDropMode      = AccordianWidget.NoDragDrop
  341.                 self._scrolling         = False
  342.                 self._scrollInitY       = 0
  343.                 self._scrollInitVal     = 0
  344.                 self._itemClass         = AccordianItem
  345.  
  346.                 # create the layout
  347.                 from PyQt4.QtGui import QVBoxLayout
  348.  
  349.                 layout = QVBoxLayout()
  350.                 layout.setContentsMargins( 3, 3, 3, 3 )
  351.                 layout.setSpacing( 3 )
  352.                 layout.addStretch(1)
  353.  
  354.                 widget.setLayout( layout )
  355.  
  356.                 self.setWidget( widget )
  357.  
  358.         def addItem( self, title, widget, collapsed = False ):
  359.                 self.setUpdatesEnabled(False)
  360.                 item    = self._itemClass( self, title, widget )
  361.                 item.setRolloutStyle( self.rolloutStyle() )
  362.                 item.setDragDropMode( self.dragDropMode() )
  363.                 layout  = self.widget().layout()
  364.                 layout.insertWidget( layout.count() - 1, item )
  365.                 layout.setStretchFactor( item, 0 )
  366.  
  367.                 if ( collapsed ):
  368.                         item.setCollapsed(collapsed)
  369.  
  370.                 self.setUpdatesEnabled(True)
  371.                 return item
  372.  
  373.         def clear( self ):
  374.                 self.setUpdatesEnabled(False)
  375.                 layout = self.widget().layout()
  376.                 while ( layout.count() > 1 ):
  377.                         item = layout.itemAt(0)
  378.  
  379.                         # remove the item from the layout
  380.                         w = item.widget()
  381.                         layout.removeItem( item )
  382.  
  383.                         # close the widget and delete it
  384.                         w.close()
  385.                         w.deleteLater()
  386.  
  387.                 self.setUpdatesEnabled(True)
  388.  
  389.         def eventFilter( self, object, event ):
  390.                 from PyQt4.QtCore import QEvent
  391.  
  392.                 if ( event.type() == QEvent.MouseButtonPress ):
  393.                         self.mousePressEvent( event )
  394.                         return True
  395.  
  396.                 elif ( event.type() == QEvent.MouseMove ):
  397.                         self.mouseMoveEvent( event )
  398.                         return True
  399.  
  400.                 elif ( event.type() == QEvent.MouseButtonRelease ):
  401.                         self.mouseReleaseEvent( event )
  402.                         return True
  403.  
  404.                 return False
  405.  
  406.         def canScroll( self ):
  407.                 return self.verticalScrollBar().maximum() > 0
  408.  
  409.         def count( self ):
  410.                 return self.widget().layout().count() - 1
  411.  
  412.         def dragDropMode( self ):
  413.                 return self._dragDropMode
  414.  
  415.         def indexOf(self, widget):
  416.                 """
  417.                         \remarks        Searches for widget(not including child layouts).
  418.                                                 Returns the index of widget, or -1 if widget is not found
  419.                         \return         <int>
  420.                 """
  421.                 layout = self.widget().layout()
  422.                 for index in range(layout.count()):
  423.                         if layout.itemAt(index).widget().widget() == widget:
  424.                                 return index
  425.                 return -1
  426.  
  427.         def isBoxedMode( self ):
  428.                 return self._rolloutStyle == AccordianWidget.Boxed
  429.  
  430.         def itemClass( self ):
  431.                 return self._itemClass
  432.  
  433.         def itemAt( self, index ):
  434.                 layout = self.widget().layout()
  435.                 if ( 0 <= index and index < layout.count() - 1 ):
  436.                         return layout.itemAt( index ).widget()
  437.                 return None
  438.  
  439.         def emitItemCollapsed( self, item ):
  440.                 if ( not self.signalsBlocked() ):
  441.                         self.itemCollapsed.emit(item)
  442.  
  443.         def emitItemDragFailed( self, item ):
  444.                 if ( not self.signalsBlocked() ):
  445.                         self.itemDragFailed.emit(item)
  446.  
  447.         def emitItemMenuRequested( self, item ):
  448.                 if ( not self.signalsBlocked() ):
  449.                         self.itemMenuRequested.emit(item)
  450.  
  451.         def emitItemsReordered( self ):
  452.                 if ( not self.signalsBlocked() ):
  453.                         self.itemsReordered.emit()
  454.  
  455.         def enterEvent( self, event ):
  456.                 if ( self.canScroll() ):
  457.                         from PyQt4.QtCore import Qt
  458.                         from PyQt4.QtGui import QApplication
  459.                         QApplication.setOverrideCursor( Qt.OpenHandCursor )
  460.  
  461.         def leaveEvent( self, event ):
  462.                 if ( self.canScroll() ):
  463.                         from PyQt4.QtGui import QApplication
  464.                         QApplication.restoreOverrideCursor()
  465.  
  466.         def mouseMoveEvent( self, event ):
  467.                 if ( self._scrolling ):
  468.                         sbar    = self.verticalScrollBar()
  469.                         smax    = sbar.maximum()
  470.  
  471.                         # calculate the distance moved for the moust point
  472.                         dy                      = event.globalY() - self._scrollInitY
  473.  
  474.                         # calculate the percentage that is of the scroll bar
  475.                         dval            = smax * ( dy / float(sbar.height()) )
  476.  
  477.                         # calculate the new value
  478.                         sbar.setValue( self._scrollInitVal - dval )
  479.  
  480.                 event.accept()
  481.  
  482.         def mousePressEvent( self, event ):
  483.                 # handle a scroll event
  484.                 from PyQt4.QtCore import Qt
  485.                 from PyQt4.QtGui import QApplication
  486.  
  487.                 if ( event.button() == Qt.LeftButton and self.canScroll() ):
  488.                         self._scrolling                 = True
  489.                         self._scrollInitY               = event.globalY()
  490.                         self._scrollInitVal     = self.verticalScrollBar().value()
  491.  
  492.                         QApplication.setOverrideCursor( Qt.ClosedHandCursor )
  493.  
  494.                 event.accept()
  495.  
  496.         def mouseReleaseEvent( self, event ):
  497.                 from PyQt4.QtCore       import Qt
  498.                 from PyQt4.QtGui        import QApplication
  499.  
  500.                 if ( self._scrolling ):
  501.                         QApplication.restoreOverrideCursor()
  502.  
  503.                 self._scrolling                 = False
  504.                 self._scrollInitY               = 0
  505.                 self._scrollInitVal             = 0
  506.                 event.accept()
  507.  
  508.         def moveItemDown(self, index):
  509.                 layout = self.widget().layout()
  510.                 if (layout.count() - 1) > (index + 1):
  511.                         widget = layout.takeAt(index).widget()
  512.                         layout.insertWidget(index + 1, widget)
  513.  
  514.         def moveItemUp(self, index):
  515.                 if index > 0:
  516.                         layout = self.widget().layout()
  517.                         widget = layout.takeAt(index).widget()
  518.                         layout.insertWidget(index - 1, widget)
  519.  
  520.         def setBoxedMode( self, state ):
  521.                 if ( state ):
  522.                         self._rolloutStyle = AccordianWidget.Boxed
  523.                 else:
  524.                         self._rolloutStyle = AccordianWidget.Rounded
  525.  
  526.         def setDragDropMode( self, dragDropMode ):
  527.                 self._dragDropMode = dragDropMode
  528.  
  529.                 for item in self.findChildren( AccordianItem ):
  530.                         item.setDragDropMode( self._dragDropMode )
  531.  
  532.         def setItemClass( self, itemClass ):
  533.                 self._itemClass = itemClass
  534.  
  535.         def setRolloutStyle( self, rolloutStyle ):
  536.                 self._rolloutStyle = rolloutStyle
  537.  
  538.                 for item in self.findChildren( AccordianItem ):
  539.                         item.setRolloutStyle( self._rolloutStyle )
  540.  
  541.         def rolloutStyle( self ):
  542.                 return self._rolloutStyle
  543.  
  544.         def takeAt( self, index ):
  545.                 self.setUpdatesEnabled(False)
  546.                 layout = self.widget().layout()
  547.                 widget = None
  548.                 if ( 0 <= index and index < layout.count() - 1 ):
  549.                         item = layout.itemAt(index)
  550.                         widget = item.widget()
  551.  
  552.                         layout.removeItem(item)
  553.                         widget.close()
  554.                 self.setUpdatesEnabled(True)
  555.                 return widget
  556.  
  557.         def widgetAt( self, index ):
  558.                 item = self.itemAt( index )
  559.                 if ( item ):
  560.                         return item.widget()
  561.                 return None
  562.  
  563.         pyBoxedMode = pyqtProperty( 'bool', isBoxedMode, setBoxedMode )
  564.  
  565. from PyQt4 import QtGui
  566.  
  567. def demoGui(GroupBox):
  568.         GroupBox.setFlat(True)
  569.         verticalLayout = QtGui.QVBoxLayout(GroupBox)
  570.  
  571.         formLayout = QtGui.QFormLayout()
  572.         formLayout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
  573.  
  574.         monkey1Label = QtGui.QLabel(GroupBox)
  575.  
  576.         formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, monkey1Label)
  577.         monkey1LineEdit = QtGui.QLineEdit(GroupBox)
  578.  
  579.         formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, monkey1LineEdit)
  580.         monnkey2Label = QtGui.QLabel(GroupBox)
  581.  
  582.         formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, monnkey2Label)
  583.         monkey3Label = QtGui.QLabel(GroupBox)
  584.  
  585.         formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, monkey3Label)
  586.         happyCheckBoxLabel = QtGui.QLabel(GroupBox)
  587.  
  588.         formLayout.setWidget(3, QtGui.QFormLayout.LabelRole, happyCheckBoxLabel)
  589.         happyCheckBoxCheckBox = QtGui.QCheckBox(GroupBox)
  590.  
  591.         formLayout.setWidget(3, QtGui.QFormLayout.FieldRole, happyCheckBoxCheckBox)
  592.         comboBox = QtGui.QComboBox(GroupBox)
  593.  
  594.         comboBox.addItem('')
  595.         comboBox.addItem('')
  596.         comboBox.addItem('')
  597.         comboBox.addItem('')
  598.         formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, comboBox)
  599.         spinBox = QtGui.QSpinBox(GroupBox)
  600.  
  601.         formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, spinBox)
  602.         verticalLayout.addLayout(formLayout)
  603.  
  604.         GroupBox.setWindowTitle(QtGui.QApplication.translate("GroupBox", "GroupBox", None, QtGui.QApplication.UnicodeUTF8))
  605.         monkey1Label.setText(QtGui.QApplication.translate("GroupBox", "Text", None, QtGui.QApplication.UnicodeUTF8))
  606.         monnkey2Label.setText(QtGui.QApplication.translate("GroupBox", "Combo", None, QtGui.QApplication.UnicodeUTF8))
  607.         monkey3Label.setText(QtGui.QApplication.translate("GroupBox", "Spin", None, QtGui.QApplication.UnicodeUTF8))
  608.         happyCheckBoxLabel.setText(QtGui.QApplication.translate("GroupBox", "CheckBox", None, QtGui.QApplication.UnicodeUTF8))
  609.         comboBox.setItemText(0, QtGui.QApplication.translate("GroupBox", "a", None, QtGui.QApplication.UnicodeUTF8))
  610.         comboBox.setItemText(1, QtGui.QApplication.translate("GroupBox", "b", None, QtGui.QApplication.UnicodeUTF8))
  611.         comboBox.setItemText(2, QtGui.QApplication.translate("GroupBox", "c", None, QtGui.QApplication.UnicodeUTF8))
  612.         comboBox.setItemText(3, QtGui.QApplication.translate("GroupBox", "d", None, QtGui.QApplication.UnicodeUTF8))
  613.         return GroupBox
  614.  
  615. if __name__ == '__main__':
  616.         from PyQt4.QtGui import QApplication
  617.         app = QApplication([])
  618.         #app.setStyle( 'Plastique' )
  619.         dlg = AccordianWidget(None)
  620.  
  621.         dlg.addItem('a', demoGui(QtGui.QGroupBox()))
  622.         dlg.addItem('b', demoGui(QtGui.QGroupBox()))
  623.         dlg.addItem('c', demoGui(QtGui.QGroupBox()))
  624.         dlg.show()
  625.         app.exec_()