避免 QTabWidget 中的重复选项卡

Posted

技术标签:

【中文标题】避免 QTabWidget 中的重复选项卡【英文标题】:Avoid duplicate Tabs in QTabWidget 【发布时间】:2013-11-26 06:07:13 【问题描述】:

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

【问题讨论】:

【参考方案1】:

要补充 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.

【讨论】:

【参考方案2】:

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

【讨论】:

我已经做到了。 for(int i=0;icount();i++) if(item->text()==tabWidget->tabText(i)) tabWidget->setCurrentIndex(i);返回; 【参考方案3】:

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

【讨论】:

【参考方案4】:

受 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);
    

【讨论】:

以上是关于避免 QTabWidget 中的重复选项卡的主要内容,如果未能解决你的问题,请参考以下文章

将选项卡从 QTabWidget 调整为内容 [重复]

通过单击 QTabWidget 外部的按钮,将每个选项卡(QTabWidget)中的数组保存到 QTabWidget 外部的二维数组

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

如何防止 QTabWidget 中的选项卡按钮缩小

如何访问 QTabWidget 不同选项卡中的小部件?

如何将 QTabWidget 中的一个选项卡设置为在 Qt 中不可移动?