Юрий
Юрий23 марта 2017 г. 23:13

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

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

12
Evgenii Legotckoi
  • 24 марта 2017 г. 0:01

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

    Evgenii Legotckoi
    • 24 марта 2017 г. 1:43

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

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

      Юрий
      • 27 марта 2017 г. 11:56

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

        Evgenii Legotckoi
        • 27 марта 2017 г. 12:50

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

            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

          Юрий
          • 27 марта 2017 г. 13:43

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

            Evgenii Legotckoi
            • 27 марта 2017 г. 13:58

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

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

            Впрочем не особо принципиально. Можно удалить все вкладки с помощью 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));
            }
              Юрий
              • 27 марта 2017 г. 14:10

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

                Evgenii Legotckoi
                • 27 марта 2017 г. 14:27

                Ну если через 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();

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

                  Юрий
                  • 27 марта 2017 г. 14:57

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

                    Юрий
                    • 27 марта 2017 г. 19:54

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

                        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
                      • 28 марта 2017 г. 0:20
                      • Ответ был помечен как решение.

                      Можете при загрузке несколько усложнить 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();
                        Юрий
                        • 31 марта 2017 г. 5:48

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

                          Комментарии

                          Только авторизованные пользователи могут публиковать комментарии.
                          Пожалуйста, авторизуйтесь или зарегистрируйтесь
                          AD

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:50баллов,
                          • Очки рейтинга-4
                          m
                          • molni99
                          • 25 октября 2024 г. 22:37

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:80баллов,
                          • Очки рейтинга4
                          m
                          • molni99
                          • 25 октября 2024 г. 22:29

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:20баллов,
                          • Очки рейтинга-10
                          Последние комментарии
                          i
                          innorwall14 ноября 2024 г. 8:42
                          Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                          i
                          innorwall14 ноября 2024 г. 6:09
                          Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                          i
                          innorwall14 ноября 2024 г. 1:05
                          EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
                          i
                          innorwall14 ноября 2024 г. 1:00
                          PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты) priligy 30mg Am J Obstet Gynecol 171 1488 505
                          Сейчас обсуждают на форуме
                          i
                          innorwall14 ноября 2024 г. 0:39
                          добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                          i
                          innorwall11 ноября 2024 г. 7:55
                          Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                          9
                          9Anonim25 октября 2024 г. 6:10
                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                          ИМ
                          Игорь Максимов3 октября 2024 г. 1:05
                          Реализация навигации по разделам Спасибо Евгений!

                          Следите за нами в социальных сетях