1

这个问题涉及Qt,但我的逻辑可能是纯C++问题。

我正在将QQuickItems 添加到有关s 及其各自父母std::map列表的商店信息中。QQuickItem

编码:

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地图显示零个带有标签的项目not access

像这样再次遍历地图。

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 的有效指针。事实上,地图中似乎没有添加任何项目。

问题:

我的逻辑有什么问题?我应该如何将QQuickItems 添加到 std::map 以便我可以安全地检索它们。

4

1 回答 1

1

首先,您在此方法中有 const 字符串而不是QQuickItem名称

findChild<QQuickItem*>("quickitem.c_str()");

所以它给你 0你应该在添加到容器之前
添加检查是否为 NULL。item

第二件事是您在谈论搜索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"
    }
}
于 2017-09-07T15:38:18.790 回答