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

时间:2016-11-27 15:26:41

标签: c++ qt layout widget

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

QWidget *myWidget = new QWidget;

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

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

根据您想要达到的目标,您可以:

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

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

答案 2 :(得分:1)

您可以使用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);

之后,您将拥有两个包含相同小部件的视图。