PyQt QGraphicsLayout Stacking
Я пытаюсь создать qgraphicslayout в Pyqt4. У меня есть серия QGraphicsLayoutItems, но кажется, что они размещаются в макете вместо пробелов. Слева все предметы находятся друг над другом.
Поскольку 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 вместо ограничительной записи графического элемента в элементе макета.
Есть идеи, что происходит? Ниже я создаю макет и добавляю элементы.
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)
РЕДАКТИРОВАТЬ: я напечатал parentLayoutItem на QGraphicsLayoutItems, и они находятся в макете.
1 ответ
Я обнаружил, что вам нужно переопределить не только функцию sizeHint в классе qGraphicsLayoutItem, но и функцию setGeometry. Я не уверен, если мне нужно переопределить функцию updateGeometry, но мы увидим: Примеры и документы
Финальный класс:
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())