Юрий
ЮрийНаурыз 24, 2017, 9:13 Т.Ж.

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

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

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

12
Evgenii Legotckoi
  • Наурыз 24, 2017, 10:01 Т.Ж.

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

    Evgenii Legotckoi
    • Наурыз 24, 2017, 11:43 Т.Ж.

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

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

      Юрий
      • Наурыз 27, 2017, 9:56 Т.Қ.

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

        Evgenii Legotckoi
        • Наурыз 27, 2017, 10: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, 11:43 Т.Қ.

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

            Evgenii Legotckoi
            • Наурыз 27, 2017, 11: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));
            }
              Юрий
              • Наурыз 28, 2017, 12:10 Т.Ж.

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

                Evgenii Legotckoi
                • Наурыз 28, 2017, 12: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();

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

                  Юрий
                  • Наурыз 28, 2017, 12:57 Т.Ж.

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

                    Юрий
                    • Наурыз 28, 2017, 5: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, 10: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, 3:48 Т.Қ.

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

                          Пікірлер

                          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                          Кіріңіз немесе Тіркеліңіз
                          Ua

                          Qt - Тест 001. Сигналы и слоты

                          • Нәтиже:84ұпай,
                          • Бағалау ұпайлары4
                          Ua

                          Qt - Тест 001. Сигналы и слоты

                          • Нәтиже:42ұпай,
                          • Бағалау ұпайлары-8
                          ОК

                          Qt - Тест 001. Сигналы и слоты

                          • Нәтиже:47ұпай,
                          • Бағалау ұпайлары-6
                          Соңғы пікірлер
                          ИМ
                          Игорь МаксимовҚар. 22, 2024, 9:51 Т.Қ.
                          Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii LegotckoiҚаз. 31, 2024, 11:37 Т.Қ.
                          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZEҚаз. 19, 2024, 5:19 Т.Қ.
                          Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь МаксимовҚаз. 5, 2024, 4:51 Т.Қ.
                          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas5Шілде 5, 2024, 8:02 Т.Қ.
                          QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Енді форумда талқылаңыз
                          f
                          firstlunoxodАқп. 15, 2025, 1:46 Т.Қ.
                          Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                          Дмитрий
                          ДмитрийАқп. 3, 2025, 4:24 Т.Қ.
                          Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                          NW
                          Nayo WaiҚаң. 30, 2025, 7:22 Т.Қ.
                          не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                          n
                          nklyҚаң. 3, 2025, 12:52 Т.Қ.
                          Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                          M
                          MarselТам. 17, 2023, 12:26 Т.Ж.
                          OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                          Бізді әлеуметтік желілерде бақылаңыз