Реклама

[QML] Постоянно перерисовывается интерфейс в ListModel Проект Navigation Drawer

QML, QtQuick, Qt, C++

Всем привет :)

За основу проекта я повзаимствовал код отсюда: Navigation Drawer

На первом фрагменте у меня 2 кнопки: Подключиться к порту (активна) и Отключиться от порта (неактивна), и сам comboBox, где собственно и хранятся порты. Естественно код связан с С++ кодом ибо я гоняю байты по модбас протоколу.
На втором фрагменте у меня dial (крутилка такая) и 9 кнопок

В чем суть: когда программа подключается к порту успешно, то кнопка “Подключиться” стаёт неактивна, а кнопка “Отключиться” соответственно активна и в comboBox’е выводиться текущий текст порта.

Но когда я переключусь с первого фрагмента на другой и потом обратно на первый, то я увижу что кнопки и comboBox перерисовались в дефолтные свои интерфейсы. То-есть кнопка “Подключиться” снова активна, кнопка “Отключиться” снова неактивна, и comboBox снова пустой. И если я попробую пересканировать порты, то comboBox ничего не покажет, кнопка “Подключиться” не отреагирует никак

Вопрос: как сделать так чтобы при переключении с фрагмента на фрагмент – элементы интерфейса не перерисовывались обратно. А были такими какими остались.

Буду очень благодарен!

  • #
  • 2 декабря 2016 г. 18:13

День добрый.

В данном случае получается, что при каждой загрузке фрагмент подгружается неинициализированным.

Вам нужно возможность сохранения настроек для фрагмента, которые Вы сможете подгружать, когда фрагмент будет добавлен. То есть при первом сканировании порта, сохраните данные в переменные, например, в переменную типа bool, которая будет говорить, что сканирование прошло успешно.

А в фрагменте можно добавить функцию init, которая будет дёргать настройку и эти данные.

Я могу ошибаться, но можно в конце фрагмента добавить такую конструкцию

Здравствуйте Евгений. Спасибо за ответ.
А разве в ListModel нету такой, дескать, опции, которая решает мои все проблемы с этими фрагментами?

В ListModel есть такое свойство как: dynamicRoles, разве оно не сможет помочь?

//Модель данных для списка с пунктами меню
    ListModel {
        id: navModel
 
        dynamicRoles: true
 
        ListElement {fragment: "Подключение к порту"}
        ListElement {fragment: "Настройка МКП"}
        ListElement {fragment: "Регулировка МКП"}
        ListElement {fragment: "Управление и токи"}
        ListElement {fragment: "О программе"}
    }

Это Ваш код. И там я включил это свойство, но после компиляции я вижу такую вот бяку:

QML ListModel: unable to enable dynamic roles as this model is not empty!

Я как бы понимаю, что не пустой, но как он может быть пустым, если там пункты меню?

  • razorqhex
  • #
  • Ответ был помечен как решение
  • 4 декабря 2016 г. 15:34

Вы путаете менюшку, которая находится в Navigation Drawer и содержимое, которое загружается в сам Loader. Это совершенно разные вещи. Эта ListModel – всего лишь список названий фрагментов. А dynamicRoles на это не влияет. Вы не в том месте пытаетесь решить проблему.

Вот здесь загружаются файлы. И их состояние нужно инициализировать, если есть какое-то уже готовое состояние. А ListModel не обязана хранить состояние фрагментов, которые загружаются в Loader.

Loader {
        id: loader
        anchors.top: menuRect.bottom
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.bottom: parent.bottom
        source: "Fragment1.qml"
 
        // Функция для смены содержимого Loader
        function loadFragment(index){
 
            switch(index){
            case 0:
                loader.source = "Fragment1.qml"
                break;
            case 1:
                loader.source = "Fragment2.qml"
                break;
            case 2:
                loader.source = "Fragment3.qml"
                break;
            default:
                loader.source = "Fragment1.qml"
                break;
            }
        }
    }

 

Реклама

Ответы

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

C++ - Тест 002. Константы

  • Результат - 50 баллов

C++ - Тест 005. Структуры и Классы

  • Результат - 66 баллов

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

  • Результат - 53 баллов
Последние комментарии
  • EVILEG
  • 23 июля 2017 г. 16:10

Использование модуля QtTextToSpeech для синтеза речи

Лично я простого не знаю способа. В обоих случаях понадобится использовать сторонние библиотеки.В случае с pdf - это будет либа, которая работает с pdf, какой-нибудь poppler-qt.В случае же ...

  • BlinCT
  • 23 июля 2017 г. 14:41

Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion

При том подходе в разработке что ведет JetBrains, скоро CLion обгонит QtCreator. Даже сейчас он в некоторых местах по функционалу уже обходит QtCreator(работа с VCS уже превосходит в удобстве)...

Использование модуля QtTextToSpeech для синтеза речи

Если вы знаете простой способ для извлечения текста из pdf или djv файлов напишите в ответе.

  • EVILEG
  • 13 июля 2017 г. 2:12

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

Ну например так можете сделать.void MoveItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ if (QApplication::mouseButtons() == Qt::RightButton) { this->deleteLa...

  • Mark
  • 13 июля 2017 г. 1:26

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

Подскажите пожалуйста как в данном проекте по перетаскиванию организовать удаление объекта со scene методом delete item, допустим при щелчке ПКМ по объекту QGraphicsScene. Мои попытки оказалис...

Сейчас обсуждают на форуме
  • EVILEG
  • 23 июля 2017 г. 19:44

Передача данных из цикла С++ в QML

День добрый. Под QQmlContext , подразумеваете, что регистрировали dataport в контексте QML , и через Connections устанавливали обработчик для сигнала ...

  • EVILEG
  • 23 июля 2017 г. 19:32

Как правильно хранить настройки подключения к БД

Я тут накидал пример простого шифрования с использованием XOR шифрования, посмотрите. Для начала Вам это должно подойти, а потом уже можно будет искать и более сложные способы шифро...

  • crak20
  • 23 июля 2017 г. 7:20

Передача нескольких переменных по UDP

Нужен пример передачи и приема переменных (например int, double, QString) по сети UDP. Как для одной переменной так и структуры. P.S новичок

Как реализовать отправку e-mail

Подключил SMTP из-под Qt при отправке сообщения QAbstractSocket::waitForBytesWritten() is not allowed in UnconnectedStateQAbstractSocket::waitForBytesWritten() is not allowe...

  • EVILEG
  • 21 июля 2017 г. 19:48

Обрезка участка изображения с сохранением пропорций

Так, а под сохранением пропорций подразумевается сохранение пропорций самой области выделения? то есть тот квадрат выделения, который перемещаете? Если есть какой код или наброски мыслей...