Избегайте дублирования вкладок в QTabWidget

У меня есть приложение, в которое я добавил QTabWidget. Вкладки закрыты. Когда я добавляю новую вкладку, если вкладка уже добавлена, она все равно добавляет новую вкладку и создает дубликат. Я хочу избежать этого дублирования. Если вкладка уже открыта, она просто активирует эту вкладку и больше не открывается. Ваша помощь будет оценена. Спасибо

4 ответа

Чтобы добавить поверх ответа Пракаша, помните, что иногда заголовок вкладки не является хорошим идентификатором содержимого вкладки (это, конечно, зависит от ситуации). Например, у вас может быть файловый менеджер, в котором текущий каталог является заголовком вкладки, но в вашей файловой системе могут быть разные каталоги с одинаковыми именами.

Для идентификации содержимого вкладки я бы следовал следующей стратегии: 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.

Используйте tabText(int index), чтобы получить идентификатор каждой вкладки перед добавлением новой вкладки addTab(QWidget * page, const QString & label) и сравнить тексты меток, если они уже существуют, только setCurrentIndex этого индекса или добавить новую вкладку,

Вдохновленный комментарием Нура Наваза, мой подход таков:

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

Также очень хорошо использовать setTabData() вместо свойства, которое является более подходящим способом.

Другие вопросы по тегам