如何在QTabWidget中禁用一个选项卡?

14

我有一个名为tabWidget的,它有三个标签:“Basic”,“Advanced”和“Current Structure”。这些标签按照这个顺序在小部件中显示。

每当布尔值为false时,我希望禁用“Advanced”选项卡。我认为代码应该很简单:

bool result = false;
if (result == false)
{
  tabWidget->widget(1)->setDisabled(true);
}

很遗憾,这段代码无法禁用选项卡,即使我勾选了它也仍然有效:

tabWidget->tabBar()->isTabEnabled(1);  // This returns true

为什么选项卡没有变成禁用状态?有其他方法可以实现吗?

我正在使用Qt 5.4.0。

4个回答

32

您可以使用成员函数setTabEnabled(int index, bool enable)在QTabWidget中启用/禁用单个选项卡。

根据您的代码片段,它看起来应该是这样的:

bool result = false;
if (result == false)
{
  tabWidget->setTabEnabled(1, false);
}

3
更简洁地说:tabWidget->setTabEnabled(1, result); 的意思是设置 tabWidget 的第一个选项卡的启用状态为 result。 - TonyK

0

这样做是不行的。

你必须遍历页面中的所有子元素并将它们禁用。

可以像这样实现:

QList<QWidget*> list = parentWidget->findChildren<QWidget*>() ;
foreach( QWidget* w, list ) {
   w->setEnabled( false ) ;
}

这正是我需要的。它可以防止选项卡内容的更改,同时保持选项卡的可见性。 - Al Conrad

-2
如果您使用Qt小部件应用程序模板,并且高级选项卡的名称为tabAdvanced(您可以在对象检查器中查看名称),那么应该可以这样工作:
ui->tabAdvanced->setEnabled(false);

应该是高级选项卡QWidget的名称,它是tabWidget的子级,您可以在对象检查器中查看名称。 - Alexander
1
提问者只想禁用QTabBar标签而不是QTabWidget,因此您的代码无法响应OP。 - eyllanesc
如果你意识到你的问题不起作用,因为你假设了很多东西,它并不普遍,我建议你阅读[答案],如果你改进了你的答案,我会取消踩。 - eyllanesc
好的,我已经编辑了我的回答(不是问题),但我仍然不明白你的说法,我从一开始就说过我的代码不是通用情况。 - Alexander
你认为使用小部件的名称是否实用和优雅?更好的选择是使用选项卡的索引。 - eyllanesc
显示剩余3条评论

-3

您可以禁用选项卡的布局。

bool result = false;
if (result == false)
{
  tabWidget->widget(1)->layout()->setDisabled(true);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接