我想在Qt的两个不同布局中使用相同的小部件。这是我的代码:
QWidget *myWidget = new QWidget;
QFormLayout *layout1 = new QFormLayout;
layout1->addWidget(myWidget);
QFormLayout *layout2 = new QFormLayout;
layout2->addWidget(myWidget);
小部件应该在layout2
中使用,但在layout1
中不可见。
解决方法是创建两个不同的myWidget
小部件,但我想知道是否有更好的方法。
为什么会发生这种情况?这样做的正确方法是什么?
答案 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);
之后,您将拥有两个包含相同小部件的视图。