Динамическое наполнение StackView QML
Не могу понять, как правильно динамически заполнять StackView в Qml...
У меня в qml описаны: ModuleTip1.qml, ModuleTip2.qml.
И есть main.qml, в котором находится StackView... Я хочу динамически запихивать в этот StackView в зависимости от типа - один из этих двух элементов, но так, чтобы при вызове метода StackView.pop() - вызывался и деструктор выталкиваемого объекта.
Проблема в том, что при StackView.pop - деструктор выталкиваемого объекта вызывается только в том случае, если объект создавался самим StackView-ом. И я не совсем пойму, как добиться такого поведения...
========
1-ПРИМЕР, как получается, но с недостатком (опишу ниже):
если я в main.qml создам
Component{id: tip1; ModuleTip1{}}
Component{id: tip2; ModuleTip2{}}
Тогда при StackView.push(tip1) - новый элемент создастся и при StackView.pop() вызовется и деструктор выталкиваемого объекта, но если этих типов модулей у меня будет 500? Столько компонентов прописывать еще и в main.qml как-то не хочется...
========
2-ПРИМЕР, где деструктор не вызывается:
дописал moduleCreation.js
var component; var sprite; function createModule(qmlTip, parent) { component = Qt.createComponent(qmlTip); if (component.status == Component.Ready){ return finishCreation(parent); } else{ component.statusChanged.connect(finishCreation); } } function finishCreation(parent) { if (component.status == Component.Ready) { sprite = component.createObject(parent, {x: 100, y: 100}); if (sprite == null) { console.log("Error creating object"); } else{ return sprite } } else if (component.status == Component.Error) { console.log("Error loading component:", component.errorString()); } }
И заполняю StackView:
StackView.push(moduleCreation.createModule("ModuleTip1.qml", StackView))
StackView.push(moduleCreation.createModule("ModuleTip2.qml", StackView))
Но при вызове StackView.pop() не вызывается деструктор выталкиваемых объектов, а очень хочется, чтобы вызывался(((
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
В QML есть сборщик мусора. Предполагаю, что во втором случае полное уничтожение объекта может вызываться позднее.
Так что попробуйте после вызова StackView.pop() сразу вызвать сборщик мусора через вызов функции gc() .
Так что, если это сработает, а также у вас нет причин в обязательном мгновенном вызове деструктора, то смысла дёргаться по этому поводу нет. Qt сам удалит объект полностью, когда сочтёт нужным в соответствии со своей логикой.
Попробовал... Вызов gc() не дал результата(((
Объекты продолжили свое существование и удалились только после того, как был удален родитель (в момент динамического создания объектов родителем указывался сам StackView)...
Но по факту это значит, что мой StackView наполняется ново-созданными объектами, раздуваясь в памяти. Память хоть и мизерная, но сам принцип такого поведения StackView меня не устраивает...
Вот и не пойму... Неужели какого-то типичного решения нет?
Вроде же достаточно стандартное поведение ожидается: "динамически засунул, тогда удаляй, когда выплевываешь"...
Я сделал немного иначе: в момент создания сохранил ссылку на объект, а потом тру ее методом .destroy()
Но все-равно странно как-то, что приходится самому руками тереть...
Я вот сейчас открыл документацию и прочитал
Так что поведение ожидаемое и странным не является, ибо описано в документации на этот метод. Документация
Проще говоря, внешнее создание объекта может предполагать использование объекта в других местах, либо кэширование. А значит, что удаление объекта при вызове метода pop() напротив является необоснованным действием
Ну так я это сразу и написал:
"Проблема в том, что при StackView.pop - деструктор выталкиваемого объекта вызывается только в том случае, если объект создавался самим StackView-ом. И я не совсем пойму, как добиться такого поведения..."
С компонентами - понятно... Но эти компоненты создавать надо самому...
А вот как создавать с помощью url-ов? Я чет не разобрался...
Ведь мои ModuleTip1.qml и тд файлы - это ведь и есть те самые урлы, которые нужно как-то этому StackView передать?
Во затупил)))
Спасибо за все)))
StackView.push("ModuleTip1.qml")
ну или в сложной иерархии StackView.push("qrc:/folder/ModuleTip1.qml")
и всего делов... Не пойму, почему сразу у меня не получилось...
StackView.push("qrc:/folder/ModuleTip1.qml", {x:100, y: 100}) - если нужны параметры