Добавление указателей QQuickItem к std::map делает их "недоступными" указателями или элементами

Этот вопрос касается Qt, но это может быть чисто проблема C++ с моей логикой.

Я добавляю QQuickItemс к std::map хранить информацию о списке QQuickItems & их соответствующие родители.

Код:

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++;
}

Проблема:

Но, когда я пытаюсь выполнить итерацию по карте, на мой QQuickItems. На самом деле выглядит так, как будто на карту не добавлены предметы.

Вопрос:

Что не так с моей логикой? Как мне добавить QQuickItems в 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"
    }
}
Другие вопросы по тегам