U
18 сентября 2020 г. 13:28
Как в qml работать с динамически созданными потомками?
Приветствую, уже полюбившийся форум)
Есть у меня Item{id: _window}, в который я по нажатию кнопки создаю объекты:
myComponent = Qt.createComponent(paletteItem.componentFile);
myComponent.createObject(_window)
Компоненты создаются, все хорошо)
Проблема в том, что потом я хочу получить информацию о всех потомках моего _window, инфу эту сохранить, а затем удалить всех потомков...
Пробовал вывести в консоль _window.children.lenght - пишет undefined...
Подскажите плиз, как добраться до потомков?..
2
99
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- AK1 апреля 2025 г. 11:41Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМ22 ноября 2024 г. 21:51Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Сейчас обсуждают на форуме
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
- Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Добрый день
В слове длина вы допустили ошибку. Если это то, что вы выводили в консоль, то тогда понятно, почему там было undefined. Надо было так
_window.children.length
Ну и вопрос в том, где именно выводите. Возможно, что нужно было через parent обращаться.
Да, каюсь) Ошибся в написании слова)
Но все равно, мне не до конца понятно, как правильно работать с динамикой в qml...
Я уперся в qml TabBar...
И есть кнопка
_bar.addItem(_myTabButton.createObject(_bar)) - в скобках у createObject указывается родитель...
Но при нажатии кнопки и выводе в консоль _bar.children.length - количество потомков не увеличивается...
Пробовал вывести адрес родителя этого самого добавляемого объекта - там не мой TabBar, а какой-то QuickItem чтоли...
В общем... Я так понял, что родителем он становится только визуально... Я пытался читать документацию, но совсем запутался...
Там написано:
If a parent is not provided to createObject(), a reference to the returned object must be held so that it is not destroyed by the garbage collector. This is true regardless of whether Item::parent is set afterwards, because setting the Item parent does not change object ownership. Only the graphical parent is changed.
Но, насколько мне позволил понять мой скудный английский - это касается случая, когда родитель меняется ПОТОМ, а не в момент создания... А у меня в момент создания указан родитель - но количество потомков все-равно не увеличивается...
Для TabBar, как я понимаю из документации, нужно проверять property contentChildren
Ок, я пошел тернистым путем))
Я в TabBar засунул переменную, в которой храню этих дурацких потомков)))
И при нажатии кнопки добавляю сам потомков)
И удаляю потомка следующим образом:
Сам объект удаляется (причем удаляется и объект, и визуально графический элемент - кароч все норм удаляется)
Но вот эта переменная tabChildrens, которая имела вид ДО удаления
[ MyTabButton_QMLTYPE_136(0x4d521c0),
MyTabButton_QMLTYPE_136(0x4756800),
MyTabButton_QMLTYPE_136(0x48f9a40) ]
после удаления ВТОРОГО элемента принимает вид:
[ MyTabButton_QMLTYPE_136(0x4d521c0),
TypeError: Type error,
MyTabButton_QMLTYPE_136(0x48f9a40) ]
Как удалить вторую запись?))
На всякие remove(index) - пишет
TypeError: Property 'remove' of object MyTabButton_QMLTYPE_161(0x2d078a0),MyTabButton_QMLTYPE_161(0x2ca6c60),MyTabButton_QMLTYPE_161(0x2c62270) is not a function
Я конечно могу руками передвинуть все записи... Но эт уже ваще зашквар какой-то...
А не пробовали использовать метод removeItem у TabBar?
Он как бы для этого и предназначен. Не стоит ходить тернистыми путями, достаточно открыть документацию ;-)
Если вы хотите найти объект по индексу, то используйте метод takeItem
Я ведь читал документацию)))
Все мои творческие извращения ведь вытекали из ремарок в доках)))
Но блин) Читал видать по-диагонали и самое последнее слово во всем описании TabBar`а, что доступ получить через contentChildren - упустил))))
Спасибо огромное! =)
Буду читать впредь внимательнее)
Если вдруг кому пригодится...
То для удаления строки из var tabChildrens - нужно использовать slice...
Я извиняюсь, что задаю такие глупые вопросы(((
Но в документации написано
void removeItem(item)
Removes and destroys the specified item.
Написал своему TabBar`у
removeItem(takeItem(currentIndex))
Но меня получается, что вкладка из TabBar`а удаляется, но сам объект вкладки (мой MyTabButton, созданный из компонента) продолжает существовать и удаляется только когда я уничтожаю окно...
Я просто прописал в MyTabButton
Component.onDestruction: {
console.log("tab destruction")
}
И в консольку НЕ сыпет об удалении в момент, когда я removeItem делаю...
Где я опять налажал?((
splice() точнее)
В QML есть сборщик мусора, он может удалять объекты не сразу а по ппрошествии времени. Попробуйте при удалении вызывать сборщик мусора принудительно через gc()
Я уничтожил объект руками) Отработал за сборщик)
Теперь буду знать, как вызвать сборщик! Спасибо!
Вам на кофе чуточку отправил ;-)
Хотя логика мне не очень понятна... Я думал, что ремув итем должен удалить объект, а не свалить на сборщик мусора...
Спасибо)
В Qt/С++ есть функция deleteLater, которую обычно используют, чтобы удалить объекты, которые наследованы от QObject .
Она добавлена для того, чтобы не удалять такие объекты сразу через оператор delete . Необъодимо это для того, чтобы Qt сам подчистил все внутренние зависимости в своём движке и удалил все ссылки и указатели на этот объект. А если вызывать оператор delete , то есть вручную удалять объект, то можно прийти к ситуации, когда программа падает без видимых причин. То есть по ващему мнению ссылок или указателей нет в программе, но где-то там внутри Qt они ещё есть.
И здесь скорее всего таже самая ситуация. Поэтому объект условно считается удалённым, но ещё существует, пока сборщик мусора об этом не позаботится.