2017-03-25 18 views
0

Pyqt4でqgraphicslayoutを作成しようとしています。私は一連のQGraphicsLayoutItemを持っていますが、スペーシングの代わりにレイアウトに積み重なっているようです。左側では、アイテムはすべて相互にオンタップされています。PyQt QGraphicsLayout Stacking

Example of the Stacking

QGraphicsLayoutItemは、私は以下のクラスでそれをオーバーライド、抽象的なので:

class AttributeGFX(QtGui.QGraphicsLayoutItem): 
"""Wrapper.""" 

def __init__(self, 
      n_x, 
      n_y, 
      n_scene, 
      n_settings, 
      n_name, 
      n_type, 
      n_io): 
    """Init.""" 
    super(AttributeGFX, self).__init__() 
    self.io = n_io 
    self.name = n_name 

    # Use same object for inputs and outputs 
    self.is_input = True 
    if "output" in n_io: 
     self.is_input = False 


    if self.is_input: 
     self.disp_settings = n_settings.display_settings['INPUTS'] 
    else: 
     self.disp_settings = n_settings.display_settings['OUTPUTS'] 

    if n_type not in self.disp_settings.keys(): 
     self.disp_settings = self.disp_settings['default'] 
    else: 
     self.disp_settings = self.disp_settings[n_type] 


    self.gitem = _AttributeGFX(n_x, 
           n_y, 
           n_scene, 
           n_settings, 
           n_name, 
           n_type, 
           n_io) 
    self.setGraphicsItem(self.gitem) 

def sizeHint(self, z, sizeh): 
    """Get the size.""" 
    boundingrec = self.gitem.boundingRect() 
    r = QtCore.QSizeF() 
    r.setHeight(boundingrec.height()) 
    r.setWidth(boundingrec.width()) 
    return r 

私は多分それはサイズヒントだと思ったので、私が代わりにQSizeFオブジェクトに大きな山車を試してみましたレイアウト項目内のグラフィック項目の境界を定めるrecの値。

何が起こっているのですか?以下はレイアウトを作成して項目を追加するところです。

class _GraphicsLayout (QtGui.QGraphicsWidget): 
    """Provide structure for organizing elements.""" 

    def __init__(self, spacing, parent): 
     """Init.""" 
     super(_GraphicsLayout, self).__init__(parent) 
     self.layout = QtGui.QGraphicsLinearLayout() 
     self.layout.setSpacing(spacing) 
     self.layout.setOrientation(QtCore.Qt.Vertical) 
     self.layout.addStretch() 
     self.setLayout(self.layout) 
     self.name = self.parentItem().name 
     self.items = {} 
     self.spacing = spacing 

    def add_item(self, item): 
     """Add a new item to the layout and transform it into position.""" 
     ''' 
     trans = self.spacing * len(self.items) - 1 + item.height 
     item.setParentItem(self) 
     item.translate(0, trans) 
     ''' 
     self.items[item.name] = item 
     self.layout.addItem(self.items[item.name]) 
     self.layout.setSpacing(self.spacing) 

EDIT:QGraphicsLayoutItemsにparentLayoutItemが印刷され、レイアウト内にあります。

答えて

0

qGraphicsLayoutItemクラスのsizeHint関数をオーバーライドするだけでなく、setGeometry関数もオーバーライドする必要があることがわかりました。私はupdateGeometry機能を無効にする必要がある場合にわからないが、我々は表示されます。ExamplesDocs

finalクラス:

class AttributeGFX(QtGui.QGraphicsLayoutItem): 
    """Wrapper.""" 

    def __init__(self, 
       n_x, 
       n_y, 
       n_scene, 
       n_settings, 
       n_name, 
       n_type, 
       n_io): 
     """Init.""" 
     super(AttributeGFX, self).__init__() 
     self.io = n_io 
     self.name = n_name 

     # Use same object for inputs and outputs 
     self.is_input = True 
     if "output" in n_io: 
      self.is_input = False 


     if self.is_input: 
      self.disp_settings = n_settings.display_settings['INPUTS'] 
     else: 
      self.disp_settings = n_settings.display_settings['OUTPUTS'] 

     if n_type not in self.disp_settings.keys(): 
      self.disp_settings = self.disp_settings['default'] 
     else: 
      self.disp_settings = self.disp_settings[n_type] 


     self.gitem = _AttributeGFX(n_x, 
            n_y, 
            n_scene, 
            n_settings, 
            n_name, 
            n_type, 
            n_io) 
     self.setGraphicsItem(self.gitem) 
     self.setMinimumHeight(3) 

    def sizeHint(self, z, sizeh): 
     """Get the size.""" 
     boundingrec = self.gitem.boundingRect() 
     r = QtCore.QSizeF() 
     r.setHeight(boundingrec.height()) 
     r.setWidth(boundingrec.width()) 
     return r 

    def setGeometry(self, x): 
     """Set geo size.""" 
     self.gitem.setPos(x.topLeft())