Юрий
March 24, 2017, 9:13 a.m.

Как сохранить последовательность вкладок QTabWidget

При переносе вкладок необходимо сохранить позиции. Как на примере horizontalHeader()->saveState().

2

Do you like it? Share on social networks!

12
Evgenii Legotckoi
  • March 24, 2017, 10:01 a.m.

А можете подробнее сформулировать? Куда и как переносите вкладки? И покажите код, если уже сделана реализация самого механизма переноса вкладок.

    Evgenii Legotckoi
    • March 24, 2017, 11:43 a.m.

    Если подразумевалось сохранение состояния при завершении программы и восстановление при запуске, то можно сохранять настройки через QSettings , например последовательность индексов и соответствие вкладок по названиям.

    Аналогично можно создавать QMap в котором будет реализовано сохранение соответствия индексов табов и их наименований. И исходя из этих соответствий настраивать QTabWidget. Придётся только наследоваться от QTabWidget, чтобы реализовать методы saveState() и restoreState(), которые будут оперировать данным QMap.

      Юрий
      • March 27, 2017, 9:56 p.m.

      При завершении программы. Как получить индексы табов? Активный таб currentIndex() а при загрузке setCurrentIndex(int);

        Evgenii Legotckoi
        • March 27, 2017, 10:50 p.m.

        Пройдитесь в цикле по всем табам.

            for (int i = 0; i < ui->tabWidget->count(); i++)
            {
                qDebug() << ui->tabWidget->tabText(i);
                qDebug() << ui->tabWidget->widget(i);
            }

        Определить нужный можно будет по тексту на табе:

        qDebug() << ui->tabWidget->tabText(i);

        Или по сравнению указателей, если добавляете табы динамически.

        if (someWidget == ui->tabWidget->widget(i))
        {
            // Тогда i - это индекс нужного таба, делаем что-нибудь с этим табом
        }

        Или же по свойству objectName

        qDebug() << ui->tabWidget->widget(i)->objectName();

        i будет соответствовать нужному индексу, даже если перемешать табы мышкой, в случае если активировано свойство movable

          Юрий
          • March 27, 2017, 11:43 p.m.

          А как задать порядок вкладок при загрузке?

            Evgenii Legotckoi
            • March 27, 2017, 11:58 p.m.

            Вы сначала скажите, как вы эти вкладки создаёте и храняться ли индексы этих вкладок где-нибудь?

            Вкладки созданы в дизайнере? или ручками создаёте их в коде?

            Впрочем не особо принципиально. Можно удалить все вкладки с помощью removeTab() , если они созданы были в дизайнере, предварительно сохранив указатели на виджеты, а потом уже в соответствии с предполагаемыми индексами, а потом с помощью методов addTab() или insertTab() , раскидать табы по нужным местам. Лучше конечно через addTab(), предварительно рассортировав виджеты в соответствии с индексами.

            Для сортировки можно к слову использовать QMap, который всегда сортируется по ключам.

            Например:

            QMap<int, QWidget*> map;
            map.insert(1, widget3);
            map.insert(2, widget1);
            map.insert(3, widget2);
            for (int i = 0; i < map.size(); i++)
            {
                ui->tabWidget->addTab(map.value(i));
            }
              Юрий
              • March 28, 2017, 12:10 a.m.

              В Дизайнере. Хранить позиции хочу QSetting в файле.

                Evgenii Legotckoi
                • March 28, 2017, 12:27 a.m.

                Ну если через QSettings, тогда почитайте эту статью .

                Да задайте настройки Tab_1, Tab_2, Tab_3, например, с указанием индекса у каждого таба. А потом уже удаляйте из QTabWidget

                QMap<int, widget *> map;
                
                for (int i = 0; i < ui->tabWidget->count(); i++)
                {
                    QString nameTab = ui->tabWidget->tabText(i);
                    if (nameTab == TAB_1)
                    {
                        map.insert(settings.value(TAB_1).toInt(), ui->tabWidget->widget(i);
                    }
                    else if (nameTab == TAB_2)
                    {
                        // И т.д.
                    }
                }
                ui->tabWidget->clear();

                И добавить заново табы, как было показано чуть выше.

                  Юрий
                  • March 28, 2017, 12:57 a.m.

                  ui->tabWidget->addTab(map.value(i)) просит задать имя таба no matching function for call to 'QTabWidget::addTab(QWidget*)' ui->tabWidget->addTab(map.value(i)); ^

                    Юрий
                    • March 28, 2017, 5:54 a.m.

                    Сделал так загрузку:

                        QMap<int, QWidget*> map;
                        QSettings settings("settings.conf", QSettings::IniFormat);
                        settings.beginGroup( "TabWidget" );
                        int tab =  settings.value("tab").toInt();
                        int tab_2 =  settings.value("tab_2").toInt();
                        int tab_3 =  settings.value("tab_3").toInt();
                        int tab_7 =  settings.value("tab_7").toInt();
                    
                        map.insert(tab, ui->tab);
                        map.insert(tab_2, ui->tab_2);
                        map.insert(tab_3, ui->tab_3);
                        map.insert(tab_7, ui->tab_7);
                    
                        for (int i = 0; i < map.size(); i++)
                        {
                            ui->tabWidget->addTab(map.value(i), ui->tabWidget->tabText(i));
                            qDebug() << map.value(i);
                        }
                        ui->tabWidget->setCurrentIndex(settings.value("currentIndex").toInt());
                        settings.endGroup();
                    Так сохраняю:
                     QSettings * settings = new QSettings("settings.conf", QSettings::IniFormat);
                      settings->beginGroup( "TabWidget" );
                      for (int i = 0; i < ui->tabWidget->count(); i++)
                       {
                           QString nameTab = ui->tabWidget->widget(i)->objectName();
                           if (nameTab == "tab")
                           {
                               settings->setValue("tab",i);
                                }
                           else if (nameTab == "tab_2")
                           {
                              settings->setValue("tab_2", i);
                                }
                           else if (nameTab == "tab_3")
                           {
                              settings->setValue("tab_3", i);
                           }
                           else if (nameTab == "tab_7")
                           {
                              settings->setValue("tab_7", i);
                           }
                       }
                      settings->setValue("currentIndex", ui->tabWidget->currentIndex());
                    
                      if(settings)
                          {
                              QMessageBox::information(this,tr("Информация"),tr("Настройки сохранены."));
                                }
                           else
                          {
                             QMessageBox::information(this,tr("Ошибка::"),tr("Saved"));
                          }
                      settings->endGroup();
                    Вопрос: как оставить название табов, которое было заданно в дизайнере?
                      Evgenii Legotckoi
                      • March 28, 2017, 10:20 a.m.
                      • The answer was marked as a solution.

                      Можете при загрузке несколько усложнить QMap, чтобы хранить в нём пару значений:

                      QMap<int, QPair<QWidget*, QString> > map;
                      QSettings settings("settings.conf", QSettings::IniFormat);
                      settings.beginGroup( "TabWidget" );
                      int tab =  settings.value("tab").toInt();
                      int tab_2 =  settings.value("tab_2").toInt();
                      int tab_3 =  settings.value("tab_3").toInt();
                      int tab_7 =  settings.value("tab_7").toInt();
                      
                      map.insert(tab, qMakePair(ui->tab, ui->tabWidget->tabText(ui->tabWidget->indexOf(ui->tab))));
                      map.insert(tab_2, qMakePair(ui->tab_2, ui->tabWidget->tabText(ui->tabWidget->indexOf(ui->tab_2))));
                      map.insert(tab_3, qMakePair(ui->tab_3, ui->tabWidget->tabText(ui->tabWidget->indexOf(ui->tab_3))));
                      map.insert(tab_7, qMakePair(ui->tab_7, ui->tabWidget->tabText(ui->tabWidget->indexOf(ui->tab_7))));
                      
                       for (int i = 0; i < map.size(); i++)
                       {
                          ui->tabWidget->addTab(map.value(i).first, map.value(i).second);
                          qDebug() << map.value(i);
                      }
                      ui->tabWidget->setCurrentIndex(settings.value("currentIndex").toInt());
                      settings.endGroup();
                        Юрий
                        • March 31, 2017, 3:48 p.m.

                        Спасибо, все работает как надо.

                          Comments

                          Only authorized users can post comments.
                          Please, Log in or Sign up
                          • Last comments
                          • AK
                            April 1, 2025, 11:41 a.m.
                            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                          • Evgenii Legotckoi
                            March 9, 2025, 9:02 p.m.
                            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                          • VP
                            March 9, 2025, 4:14 p.m.
                            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                          • ИМ
                            Nov. 22, 2024, 9:51 p.m.
                            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          • Evgenii Legotckoi
                            Oct. 31, 2024, 11:37 p.m.
                            Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup