在 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);
之后你有两个包含相同小部件的视图。
我想在 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);
之后你有两个包含相同小部件的视图。