U
Undergiven18 вересня 2020 р. 03:28
Как в qml работать с динамически созданными потомками?
Приветствую, уже полюбившийся форум)
Есть у меня Item{id: _window}, в который я по нажатию кнопки создаю объекты:
myComponent = Qt.createComponent(paletteItem.componentFile);
myComponent.createObject(_window)
Компоненты создаются, все хорошо)
Проблема в том, что потом я хочу получить информацию о всех потомках моего _window, инфу эту сохранить, а затем удалить всех потомков...
Пробовал вывести в консоль _window.children.lenght - пишет undefined...
Подскажите плиз, как добраться до потомков?..
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
l
- laei
- 23 квітня 2024 р. 09:19
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:10бали,
- Рейтинг балів-10
Останні коментарі
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко05 лютого 2024 р. 01:50
EVA25 грудня 2023 р. 10:30
Boost - статичне зв'язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
DA
Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
Dr Gangil Academics20 квітня 2024 р. 07:45
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев14 квітня 2024 р. 02:35
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
Добрый день
В слове длина вы допустили ошибку. Если это то, что вы выводили в консоль, то тогда понятно, почему там было 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 они ещё есть.
И здесь скорее всего таже самая ситуация. Поэтому объект условно считается удалённым, но ещё существует, пока сборщик мусора об этом не позаботится.