Advertisement
Guest User

PyQt collapsible GroupBox

a guest
May 14th, 2012
1,409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 17.36 KB | None | 0 0
  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_()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement