Добавление указателей QQuickItem к std::map делает их "недоступными" указателями или элементами
Этот вопрос касается Qt, но это может быть чисто проблема C++ с моей логикой.
Я добавляю QQuickItem
с к std::map
хранить информацию о списке QQuickItem
s & их соответствующие родители.
Код:
std::array<std::string, 2> ObjectNamesArray = { "quickitemObj1", "quickitemObj2" };
std::map<QQuickItem*, QQuickItem*> items;
for(const auto& quickitem: ObjectNamesArray) {
QQuickItem * item = Qmlengine->rootObjects()[0]->findChild<QQuickItem*>(quickitem.c_str());
if (item != NULL)
items.insert(std::make_pair(item, item->parent());
// for a test, following works fine with the item pointer within this loop
qreal width ? item->width();
}
Отладка через цикл выше, items
карта показывает ноль предметов с тегом недоступным.
Итерации по карте снова, как это.
std::map<QQuickItem*, QQuickItem*>::iterator it = items.begin();
while (it != items.end()) {
QQuickItem* item = it->first;
QQuickItem * itemParent = it->second; // crashes here as *item is null
it++;
}
Проблема:
Но, когда я пытаюсь выполнить итерацию по карте, на мой QQuickItem
s. На самом деле выглядит так, как будто на карту не добавлены предметы.
Вопрос:
Что не так с моей логикой? Как мне добавить QQuickItem
s в std::map, чтобы я мог безопасно вернуть их обратно.
1 ответ
Сначала у вас есть константная строка внутри этого метода вместо QQuickItem
название
findChild<QQuickItem*>("quickitem.c_str()");
Так что это дает вам 0
Вы должны добавить проверку, если item
NULL перед добавлением в контейнер.
Во-вторых, вы говорите о поиске items
карта, но здесь вы добавляете parents
parents.insert(std::make_pair(item, item->parent());
Кстати: когда вы используете Qt, я рекомендую вам использовать контейнеры Qt
РЕДАКТИРОВАТЬ:
Это работает для меня, после некоторых улучшений, и если у меня есть соответствующие объекты в QML
CPP
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
std::array<std::string, 2> ObjectNamesArray = { "quickitemObj1", "quickitemObj2" };
std::map<QQuickItem*, QQuickItem*> items;
for(const auto& quickitem: ObjectNamesArray) {
QQuickItem * item = engine.rootObjects()[0]->findChild<QQuickItem*>(quickitem.c_str());
if (item != NULL)
items.insert(std::make_pair(item, (QQuickItem*)item->parent()));
}
std::cout << "Map: " << items.size() << std::endl; //it gives 2
std::map<QQuickItem*, QQuickItem*>::iterator it = items.begin();
while (it != items.end()) {
QQuickItem* item = it->first;
QQuickItem * itemParent = it->second; // no crash
it++;
}
QML
import QtQuick 2.6
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Item
{
objectName: "quickitemObj1"
}
Item
{
objectName: "quickitemObj2"
}
}