我有一个应用程序,我在其中添加了一个QTabWidget。 标签可以关闭。 当我添加新标签时,如果已添加标签,它仍然会添加新标签并复制。 我想避免这种重复。 如果选项卡已经打开,那么它只是激活该选项卡而不再打开。 您将获得帮助。 感谢
答案 0 :(得分:2)
要在Prakash的答案之上添加,请注意有时标签标题不是标签内容的良好标识符(这当然取决于具体情况)。例如,您可能有一个文件管理器,其中当前目录是选项卡的标题,但在您的文件系统中可能存在具有相同名称的不同目录。
我会遵循以下策略来识别选项卡内容:Qt允许您为小部件设置动态属性(请参阅QObject::setProperty),因此每次创建新选项卡时,例如文件管理器,您可能会做点什么
widget = ...
widget->setProperty("tab_dir_fullpath", the_full_path);
tabWidget->addWidget(widget, directory_name);
其中the_full_path
将是唯一标识符(在此示例中为当前目录的完整绝对路径),该标识符不会显示给用户,但您可以在以后用它来查看给定目录是否为已经开放了。
然后,在打开新标签时,您应检查是否已打开相同的完整路径:
for (int k = 0; k < tabWidget->count(); ++k) {
if (tabWidget->widget(k)->property("tab_dir_fullpath").toString() == the_full_path_to_open) {
tabWidget->setCurrentIndex(k);
return;
}
}
... // open new tab, as in the previous snippet.
答案 1 :(得分:1)
使用tabText(int index)获取每个选项卡的标识符,然后添加新的选项卡addTab(QWidget * page,const QString&amp; label)并比较标签文本,如果已经存在那个索引的setCurrentIndex或者其他添加新标签。
答案 2 :(得分:0)
使用setTabData()代替属性也是非常好的,这是更合适的做法。
答案 3 :(得分:0)
受到 Noor Nawaz 评论的启发,我的方法是:
void MainWindow::openPanel1()
{
for(int i=0;i<ui->tabWidget->count();i++) {
if(ui->tabWidget->tabText(i) == "Panel1") {
ui->tabWidget->setCurrentIndex(i);
return;
}
}
Panel1 = new panel1Widget();
int index = ui->tabWidget->addTab(Panel1,"Panel1");
ui->tabWidget->setCurrentIndex(index);
}