2017-09-07 7 views
1

Diese Frage Qt beinhaltet, konnte aber reines C++ Problem mit meiner Logik sein.Hinzufügen QQuickItem Zeiger auf einen std :: map macht sie alle „nicht zugänglich“ Zeiger oder Artikel

I QQuickItem s zu einer std::map speichern Informationen über eine Liste von QQuickItem s & ihren Eltern am hinzufügen.

Der Code:

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(); 
} 

Debugging durch obige Schleife, die items Karte zeigt Null Teile mit dem Tag nicht zugänglich.

Iterating über die Karte wieder so.

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

Problem:

Aber, wenn ich versuche, durch die Karte zu durchlaufen, gibt es keine gültigen Zeiger auf meine QQuickItem s. Tatsächlich sieht es so aus, als ob der Karte keine Gegenstände hinzugefügt wurden.

Frage:

Was mit meiner Logik ist falsch? Wie sollte ich QQuickItem s zu einer std :: map hinzufügen, damit ich sie sicher zurückholen kann.

Antwort

1

Zuerst const String in dieser Methode istead von QQuickItem Name

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

So haben es gibt Ihnen 0
sollten Sie die Überprüfung hinzufügen, wenn item vor der Zugabe zu dem Behälter NULL ist.

Die zweite Sache ist, dass Sie sprechen über items Karte suchen, aber hier sind Anfügen Sie parents

parents.insert(std::make_pair(item, item->parent()); 

BTW: Wenn Sie Qt verwenden, empfehle ich mit Ihnen Qt containers

EDIT:
Dies funktioniert für mich, nach einigen Verbesserungen und wenn ich geeignete Objekte in QML haben


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" 
    } 
} 
+0

hinzugefügt null zu überprüfen. Außerdem habe ich einen Aufruf hinzugefügt, um die Breite des 'QQuickItem' in der Array-Schleife abzurufen, was gut funktioniert. nicht sicher, was schief geht, wenn ich 'QQuickItem *' zur Karte hinzufüge. –

+0

Entschuldigung wegen der Verwirrung. habe meine Frage korrigiert, um den genauen Code zu demonstrieren. Bitte werfen Sie einen Blick –

+1

@Programist Versuchen Sie meinen Code jetzt, welchen Compiler verwenden Sie? – Macias

Verwandte Themen