将 QQuickItem 指针添加到 std::map 使它们都是 "not accessible" 指针或项目
Adding QQuickItem pointers to an std::map makes them all "not accessible" pointers or items
这个问题涉及 Qt 但可能是纯 C++ 我的逻辑问题。
我正在将 QQuickItem
添加到 std::map
商店信息中,关于 QQuickItem
列表及其各自的 parents。
代码:
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
的有效指针。事实上看起来没有项目添加到地图。
问题:
我的逻辑有什么问题?我应该如何将 QQuickItem
添加到 std::map 以便我可以安全地取回它们。
首先你在这个方法中有 const string 而不是 QQuickItem
name
findChild<QQuickItem*>("quickitem.c_str()");
所以它给你 0
在添加到容器之前,您应该添加检查 item
是否为 NULL。
第二件事是你在谈论搜索 items
地图,但在这里,你要附加到 parents
parents.insert(std::make_pair(item, item->parent());
顺便说一句:当你使用Qt时,我建议你使用Qt containers
编辑:
这对我有用,经过一些改进,如果我在 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"
}
}
这个问题涉及 Qt 但可能是纯 C++ 我的逻辑问题。
我正在将 QQuickItem
添加到 std::map
商店信息中,关于 QQuickItem
列表及其各自的 parents。
代码:
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
的有效指针。事实上看起来没有项目添加到地图。
问题:
我的逻辑有什么问题?我应该如何将 QQuickItem
添加到 std::map 以便我可以安全地取回它们。
首先你在这个方法中有 const string 而不是 QQuickItem
name
findChild<QQuickItem*>("quickitem.c_str()");
所以它给你 0
在添加到容器之前,您应该添加检查 item
是否为 NULL。
第二件事是你在谈论搜索 items
地图,但在这里,你要附加到 parents
parents.insert(std::make_pair(item, item->parent());
顺便说一句:当你使用Qt时,我建议你使用Qt containers
编辑:
这对我有用,经过一些改进,如果我在 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"
}
}