я использую QGraphicsWidget
а также QGraphics[Linear]Layout
внутри QGraphicsScene
создать узел типа «Виджет».
Каждый узел имеет заголовок, несколько IOGraphicsWidgets
и нижний колонтитул.
Структура кода:
Требуемый макет:
Результат текущего кода:
Как вы можете видеть NodeGraphicsWidget
(красный прямоугольник за HeaderWidget) не изменяется, чтобы содержать все элементы, добавленные к нему. Расстояние между LayoutItems
также огромен и m_centerWidgetLayout->setSpacing(0)
ничего не изменилось. Прямо сейчас я думаю написать все макеты самостоятельно, но я надеюсь, что есть лучший способ использовать стандартный qt.
NodeGraphicsWidget:addIOWidget(AbstractIOGraphicsWidget *ioWidget)
просто добавляет данное AbstractIOGraphicsWidget
к m_centerWidgetLayout
,
Конструктор NodeGraphicsWidget
:
NodeGraphicsWidget::NodeGraphicsWidget(NodeGraphicsWidget::WidgetCreationFunction headerCreationFunc, NodeGraphicsWidget::WidgetCreationFunction footerCreationFunc, QGraphicsItem *parent, Qt::WindowFlags wFlags):
QGraphicsWidget(parent, wFlags)
{
m_headerWidget = new QGraphicsWidget(this);
m_centerWidget = new QGraphicsWidget(this);
m_centerWidgetLayout = new QGraphicsLinearLayout(Qt::Orientation::Vertical, m_centerWidget);
m_centerWidgetLayout->setSpacing(0);
m_centerWidget->setLayout(m_centerWidgetLayout);
m_footerWidget = new QGraphicsWidget(this);headerCreationFunc(this, m_headerWidget);
if(footerCreationFunc != nullptr){
footerCreationFunc(this, m_footerWidget);
}
setAutoFillBackground(true);
QPalette pal;
pal.setColor(QPalette::Window, QColor(Qt::red));
this->setPalette(pal);
}
Чтобы увидеть полный исходный код визита: https://github.com/nidomiro/QtNodes/tree/f5426c154a4938481f00031f031507499cc0e183/src
Я нашел решение своей проблемы сам. Сначала я забыл корневой макет NodeGraphicsWidget
но это не решило всю проблему. Основная проблема, расстояние между предметами, не было реальной проблемой. Настоящая проблема заключалась в том, что каждый QGraphicsLinearLayout
имеет запас по умолчанию и AbstractIOGraphicsWidget
Корневой макет имел эти поля. layout->setContentsMargins(0,0,0,0)
решил проблему.
Других решений пока нет …