0

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

4

4 回答 4

2

要在 Prakash 的答案之上添加,请注意有时选项卡标题不是选项卡内容的良好标识符(这当然取决于情况)。例如,您可能有一个文件管理器,其中当前目录是选项卡的标题,但在您的文件系统中可能存在同名的不同目录。

我将遵循以下策略来识别选项卡内容:Qt 允许您为小部件设置动态属性(请参阅QObject::setProperty),因此每次创建新选项卡时,例如文件管理器,您可能会执行类似的操作

widget = ...
widget->setProperty("tab_dir_fullpath", the_full_path);
tabWidget->addWidget(widget, directory_name);

wherethe_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.
于 2013-11-26T12:40:42.417 回答
1

在添加新选项卡之前使用 tabText(int index) 获取每个选项卡的标识符 addTab(QWidget * page, const QString & label) 并比较标签文本,如果已经存在,则只需设置该索引的当前索引或添加新选项卡.

于 2013-11-26T06:20:34.267 回答
0

使用 setTabData() 代替属性也很好,这是更正确的做法。

于 2014-07-04T11:42:28.333 回答
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);
    }
于 2021-06-03T10:22:22.340 回答