QGraphicsWidget 和 QGraphicsLayout 间距和大小
QGraphicsWidget and QGraphicsLayout spacing and sizes
我在 QGraphicsScene
中使用 QGraphicsWidget
和 QGraphics[Linear]Layout
来创建一个像 "Widget" 这样的节点。
每个节点都有一个页眉,多个 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)
解决了问题。
我在 QGraphicsScene
中使用 QGraphicsWidget
和 QGraphics[Linear]Layout
来创建一个像 "Widget" 这样的节点。
每个节点都有一个页眉,多个 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)
解决了问题。