Qt 如何将小部件从一个选项卡移动到另一个选项卡并保持布局

Qt 如何将小部件从一个选项卡移动到另一个选项卡并保持布局,qt,Qt,我有一个选项卡式小部件,所有的选项卡都有相同的布局,所以我想在用户更改选项卡时移动小部件。这个的代码是什么。我尝试了一些东西,但似乎总是错过一件事。以下操作仅工作一次,但在更改当前选项卡时从调用的插槽中无法执行: txDiag_1是一个定制小部件,占据整个选项卡区域 tabList.at(i)是对tabWidget内选项卡的引用,MovingLayout是水平布局 ui.txDiag_1->setParent(tabList.at(1)); movingHlayout->setPar

我有一个选项卡式小部件,所有的选项卡都有相同的布局,所以我想在用户更改选项卡时移动小部件。这个的代码是什么。我尝试了一些东西,但似乎总是错过一件事。以下操作仅工作一次,但在更改当前选项卡时从调用的插槽中无法执行: txDiag_1是一个定制小部件,占据整个选项卡区域 tabList.at(i)是对tabWidget内选项卡的引用,MovingLayout是水平布局

ui.txDiag_1->setParent(tabList.at(1));
movingHlayout->setParent(tabList.at(1));
movingHlayout->setSpacing(3);
movingHlayout->setMargin(3);
movingHlayout->setObjectName(QString::fromUtf8("movingHlayout"));
movingHlayout->addWidget(ui.txDiag_1);
tabList.at(1)->setLayout(movingHlayout);

我想也许我应该先删除旧的小部件,但我想我可以破坏旧的布局,每次都创建一个新的,但它仍然不起作用。

只是澄清一下,您有一组选项卡,可以控制小部件,当用户更改选项卡时,这些选项卡会发生轻微变化,你想重用这个小部件,而不是为每个标签创建一个

如果是这种情况,那么添加一个小部件并拥有一个小部件。然后将选项卡栏上的currentChanged信号连接到您自己的插槽,这样当用户更改当前选项卡时,您就可以更新小部件了。

好,明白了

基本上你需要:

1.从布局中删除要移动的小部件
2.删除布局
3.使用带有父参数的构造函数创建新布局(父参数是您希望将小部件移动到的tabWidget的选项卡之一)
4.添加要移动到布局的小部件

layoutPointer->removeWidget(ui.WidgetName)
删除布局指针
layoutPointer=新的QHBoxLayout(destTabName)
layoutPointer->addWidget(WidgetName)


注意,确保tabWidget中只有一个布局,并使用其指针删除并重新创建其指向的布局,否则它将无法工作

严的回答很好,但我觉得很难理解。我希望这一答复将详细说明解决办法

目标是跨
n
distinct
QTabWidget
页面共享
QWidget
的单个实例

每个页面将包含一个小部件,该小部件占用
QTabWidget
中的所有可用区域。如果您希望在一个页面上有多个用户界面元素,请将它们放在一个小部件中,就像我在下面所做的那样。因此,创建自定义的
QWidget
。这是我的

这里是我动态创建5个选项卡的地方:

void MyWindow::setupTabs() 
{
  for (int i = 0; i < 5; ++i)
  {
    QWidget * w = new QWidget;
    w->setLayout(new QHBoxLayout);
    ui->tabWidget->addTab(w, "Tab " + std::to_string(i));
  }

  connect(
    ui->tabWidget,
    SIGNAL(currentChanged(int)),
    this,
    SLOT(onTabChanged(int)));
}
在插槽中,我们得到页面小部件的布局。然后,我们将页面小部件从它自己的布局中删除。接下来我们删除该布局。我们创建一个新的布局。我们将自定义小部件添加到布局中。最后,我们在页面小部件上设置布局

完成后,您的单个
QWidget
实例将在所有选项卡上使用,并且它将根据其父级布局适当调整大小/拉伸


现在非常感谢。

setParent足以将小部件从一个容器移动到另一个容器。但是当您更改父项时,小部件是隐藏的,因此,您需要再次显示它

ui.txDiag_1->setParent(tabList.at(1));
ui.txDiag_1->show();

好的,谢谢,我会试试的。抱歉回复太长,周末很长:)
ui.txDiag_1->setParent(tabList.at(1));
ui.txDiag_1->show();