我有一个标签式小部件,所有标签都有相同的布局,因此我想在用户更改标签时移动小部件。这将是什么代码。我尝试过一些东西,但似乎总是缺少一件事。以下只能使用一次,但不能从当前选项卡更改时调用的插槽中执行: txDiag_1是一个自定义小部件,占用整个标签区域 tabList.at(i)是对tabWidget中选项卡的引用,movingHlayout是一个水平布局。
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);
我想也许我应该首先删除旧的小部件,但我想我可以破坏旧的布局并每次创建一个新的布局,但它仍然没有用。
答案 0 :(得分:6)
为了澄清一下,您有一组控制窗口小部件的选项卡,当用户更改选项卡时,它会稍微改变,并且您希望重用该窗口小部件而不是为每个选项卡创建一个窗口小部件?
如果是这种情况,则添加QTabBar并拥有一个小部件。然后将标签栏上的currentChanged信号连接到您自己的插槽,因此当用户更改当前标签时,您将更新小部件。
答案 1 :(得分:2)
Yan的答案很好,但我发现很难理解。我希望这个答案能够详细说明解决方案。
目标是在QWidget
个不同n
页面之间共享QTabWidget
的单个实例。
每个页面都会包含 一个 小部件,该小部件占用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)));
}
在创建每个标签时为每个标签设置布局,如上所示。这保持了每个页面小部件始终具有布局的不变性#34;。
这是插槽:
void MyWindow::onTabChanged(int index)
{
QLayout * layout = ui->tabWidget->widget(index)->layout();
layout->removeWidget(ui->tabWidget->widget(index));
delete layout;
layout = new QHBoxLayout;
layout->addWidget(ui->flowTabWidget);
ui->tabWidget->widget(index)->setLayout(layout);
}
在插槽中,我们获得了页面小部件的布局。然后我们从自己的布局中删除页面小部件。接下来我们删除该布局。我们创建了一个新的布局。我们将自定义小部件添加到布局中。最后,我们在页面小部件上设置布局。
完成后,您的单个QWidget
实例将在所有标签页中使用,而 会因其父级布局而适当调整大小/展开 强>
非常感谢你。
答案 2 :(得分:1)
好的,明白了。
基本上你需要:
1.删除要从布局移动的小部件
2.删除布局
3.使用带有父参数的构造函数创建一个新布局(parent是您希望将窗口小部件移动到的tabWidget的一个选项卡)
4.添加要移动到布局的小部件
layoutPointer->removeWidget(ui.WidgetName);
delete layoutPointer;
layoutPointer= new QHBoxLayout(destTabName);
layoutPointer->addWidget(WidgetName);
P.S。确保tabWidget中只有一个布局,并使用它删除的指针并重新创建它指向的布局,否则它将无法工作。
答案 3 :(得分:0)
setParent 足以将一个小部件从一个容器移动到另一个容器。但是当您更改父项时,该小部件将被隐藏,因此,您需要再次显示它。
ui.txDiag_1->setParent(tabList.at(1));
ui.txDiag_1->show();