避免在QTabWidget中重复使用Tabs

时间:2013-11-26 06:07:14

标签: qt qtabwidget

我有一个应用程序,我在其中添加了一个QTabWidget。 标签可以关闭。 当我添加新标签时,如果已添加标签,它仍然会添加新标签并复制。 我想避免这种重复。 如果选项卡已经打开,那么它只是激活该选项卡而不再打开。 您将获得帮助。 感谢

4 个答案:

答案 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);
    }