Юрий
Юрий23. März 2017 23:13

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

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

12
Evgenii Legotckoi
  • 24. März 2017 00:01

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

    Evgenii Legotckoi
    • 24. März 2017 01:43

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

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

      Юрий
      • 27. März 2017 11:56

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

        Evgenii Legotckoi
        • 27. März 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. März 2017 13:43

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

            Evgenii Legotckoi
            • 27. März 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. März 2017 14:10

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

                Evgenii Legotckoi
                • 27. März 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. März 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. März 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. März 2017 00:20
                      • Die Antwort wurde als Lösung markiert.

                      Можете при загрузке несколько усложнить 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. März 2017 05:48

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

                          Kommentare

                          Nur autorisierte Benutzer können Kommentare posten.
                          Bitte Anmelden oder Registrieren
                          Letzte Kommentare
                          A
                          ALO1ZE19. Oktober 2024 08:19
                          Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь Максимов5. Oktober 2024 07:51
                          Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas55. Juli 2024 11:02
                          QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          k
                          kmssr8. Februar 2024 18:43
                          Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                          Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                          Jetzt im Forum diskutieren
                          J
                          JacobFib17. Oktober 2024 03:27
                          добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                          JW
                          Jhon Wick1. Oktober 2024 15:52
                          Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                          КГ
                          Кирилл Гусарев27. September 2024 09:09
                          Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                          F
                          Fynjy22. Juli 2024 04:15
                          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                          Folgen Sie uns in sozialen Netzwerken