在 Qt 中的两种不同布局中使用相同的小部件

Use the same widget in two different layouts in Qt

我想在 Qt 的两种不同布局中使用同一个小部件。这是我的代码:

QWidget *myWidget = new QWidget;

QFormLayout *layout1 = new QFormLayout;
layout1->addWidget(myWidget);

QFormLayout *layout2 = new QFormLayout;
layout2->addWidget(myWidget);

该小部件在 layout2 中应有,但在 layout1 中不可见。

解决方法是创建两个不同的 myWidget 小部件,但我想知道是否有更好的方法。

为什么会发生这种情况,正确的做法是什么?

addWidget 将所有权从 layout1 转移到 layout2
对象树是 Qt 用来组织对象的方式。例如,具有父项 的项目显示在其父项的坐标系中,并被其父项的边界 .
以图形方式裁剪 您可以尝试解决该限制,但这不是您使用 Qt 的方式,我不建议这样做。
如果您需要两个小部件,请创建两个小部件。这就是 Qt 的设计方式和使用方式。

有关 Qt 对象模型的更多详细信息,请参阅 here

同一对象不能出现在多个地方。它只有一次实例,并且只存在于一个位置。您只能有多个参考。诚然,布局不采用小部件实例,而是对其的引用(指针),但 Qt 的设计是将小部件添加到布局会将所有权转移到布局的底层小部件。这是有道理的,这两种布局可能需要不同的小部件几何形状,而单个小部件如何同时具有两种几何形状?即使理论上可行,如果不从小部件中抽象出几何图形也是不可能的,而在 Qt 的情况下,几何图形是小部件的一部分,因此这是不可能的。而这只是使这种 reuse/sharing 具有挑战性而不真正可行的众多方面之一。

根据您想实现的目标,您可以:

  • 重用 GUI 元素 - 在这种情况下推出 YourOwnWidget : public QWidget,然后您可以根据需要多次实例化

  • 在多个 GUI 元素之间共享相同的数据,除了上一步之外,您真正想要做的是将 data 放在一个单独的,不可见对象,那么您可以根据需要创建和绑定任意数量的 GUI 元素类型和实例。

您可以使用 QGraphicsView。定义一个 QGraphicsView 实例并将其添加到 layout1:

QGraphicsView *gv1 = new QGraphicsView();
layout1->addWidget(gv1);

再定义一个添加到layout2:

QGraphicsView *gv2 = new QGraphicsView();
layout2->addWidget(gv2);

QGraphicsScene *qc = new QGraphicsScene();
qc->addWidget(myWidget);

现在为您的 QGraphicsView 对象设置场景

gv1->setScene(qc);
gv2->setScene(qc);

之后你有两个包含相同小部件的视图。