A
ArtisanМамыр 13, 2020, 3:03 Т.Ж.

TabBar QML. Сохранение изменений при переключении между контентом (вкладками, .qml-файлами).

QML, TabBar

Всем добрый день. Для заполнения TabBar использую компонент loader, а в качестве содержимого .qml-файлы. Путь задаю через параметр source. Во время работы во вкладках начальный контент (загружаемый из .qml-файлов) изменяется (например выбирается один из RadioButton или устанавливается положение Slider), но при переходе в другую вкладку и последующем возврате в предыдущую, контент обновляется до первоначального состояния, что логично, т.к. перед использованием в TabBar qml-файла контента, он был скомпилирован посредством source.
Каким образом можно поддерживать во время работы программы (при переключении в TabBar межу разными вкладками .qml-файлами) текущие состояния компонентов (во всех вкладках), а не возвращаться к первоначальным состояниям.

P.S. Речь идёт именно о поддержании (сохранении) состояний quick компонентов. Если же quick компонент имеет наполнение из C++ части кода посредством Q_PROPERTY проблем нет. Не хотелось бы отводить в С++ "медиаторе" ненужные поля только под сохранение состояний каждого визуального компонента, перекидываясь сигналами-слотами.

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

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

4
Evgenii Legotckoi
  • Мамыр 13, 2020, 3:59 Т.Ж.
  • (өңделген)
  • Жауап шешім ретінде белгіленді.

Добрый день.

Попробуйте использовать Settings QML Type

Думаю, что можно добавить в каждый таб систему настроек и сохранять текущее состояние, а при перезапуске таба восстанавливать из настроек в обработчике Component.onCompleted

    A
    • Мамыр 13, 2020, 11:11 Т.Ж.

    Подход помог, спасибо!
    При переходе из вкладки в вкладку, объект из qml-файла уничтожается, мы сохранили параметры, а возврат к вкладке аналогичен новому «запуску» с сохранёнными параметрами.
    А есть ли способ подсовывания контента (qml-файла) помимо loader чтобы не происходил постоянный процесс создания, уничтожения объекта (по сути, аналог закрытия открытия программы), а контент неактивной вкладки продолжал своё существование (т.е время жизни равнялось времени жизни работы всего приложения)?
    (к примеру, таймер запущенный только в qml- файле контента продолжал свой счёт даже когда вкладка не открыта, конечно таймер на стороне С++ сделает это же и передаст своё значение в момент открытия вкладки, но возможен визуальный процесс логика которого описана только в qml и переносить в С++ лишнее.) Можно отказаться от раздельных qml-файлов и реализовать всё в одном qml-файле отвечающем за всё приложение и описывающее все вкладки TabBar, тогда все элементы будут иметь время жизни работы программы в целом, но уж очень громоздкое и не красивое решение.
    Еще раз спасибо за решение с Settings QML Type и Component.onCompleted!

      Evgenii Legotckoi
      • Мамыр 13, 2020, 3:21 Т.Қ.

      Ну а чем вам не угодило решение, которое описано в документации на TabBar с использованием StackView?
      Там не используется Loader и все страницы просто загружаются при запуске программы. Как понимаю, они будут работатеть на протяжении всего жизненного цикла, если только принудительно не будут удалться или добавляться.

      TabBar {
          id: bar
          width: parent.width
          TabButton {
              text: qsTr("Home")
          }
          TabButton {
              text: qsTr("Discover")
          }
          TabButton {
              text: qsTr("Activity")
          }
      }
      
      StackLayout {
          width: parent.width
          currentIndex: bar.currentIndex
          Item {
              id: homeTab
          }
          Item {
              id: discoverTab
          }
          Item {
              id: activityTab
          }
      }
      
        A
        • Мамыр 14, 2020, 1:23 Т.Ж.

        Даже и не подумал о StackView, а это именно моё решение, а не loader что ошибочно применял. Спасибо еще раз, теперь всё работает как надо!

          Пікірлер

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

          C++ - Тест 001. Первая программа и типы данных

          • Нәтиже:66ұпай,
          • Бағалау ұпайлары-1
          t

          C++ - Тест 001. Первая программа и типы данных

          • Нәтиже:33ұпай,
          • Бағалау ұпайлары-10
          t

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

          • Нәтиже:52ұпай,
          • Бағалау ұпайлары-4
          Соңғы пікірлер
          G
          GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
          Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
          d
          dblas5Шілде 5, 2024, 11:02 Т.Ж.
          QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          k
          kmssrАқп. 8, 2024, 6:43 Т.Қ.
          Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
          АК
          Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
          Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
          Енді форумда талқылаңыз
          Evgenii Legotckoi
          Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
          F
          FynjyШілде 22, 2024, 4:15 Т.Ж.
          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
          BlinCT
          BlinCTМаусым 25, 2024, 1 Т.Ж.
          Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
          BlinCT
          BlinCTМамыр 5, 2024, 5:46 Т.Ж.
          Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
          Evgenii Legotckoi
          Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
          Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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