2016-04-21 10 views
1

In Listview, ich habe 100 von Artikeln mit "Delegat", nehmen Sie an, dass listview bereits aufgefüllten Wert angezeigt. Nun möchte ich bereits angezeigte Werte in der QML-Listenansicht aus C++ extrahieren. Wie erreiche ich das? Hinweis: Ich kann Datenmodell nicht direkt zugreifen, da ich Filtration tue in Delegaten versteckt VariableZugriff auf QML ListView-Delegatelemente aus C++?

 /*This is not working code, Please note, 
     delegate will not display all model data.*/ 
     ListView 
     { 
     id:"listview" 
      model:datamodel 
      delegate:{ 
         if(!hidden) 
         { 
         Text{   
         text:value 
         } 
        } 

     } 


//Can I access by using given approach? 
QObject * object = m_qmlengine->rootObjects().at(0)->findChild<QObject* >("listview"); 

//Find objects 
const QListObject& lists = object->children(); 

//0 to count maximum 
//read the first property 
QVarient value = QQmlProperty::read(lists[0],"text"); 
+0

Sie sollten mindestens mit einem Code beginnen, das funktioniert. Außerdem sollten Sie den Zugriff von C++ auf QML auf ein Minimum beschränken, ganz sicher nicht in diesem Fall. Verwenden Sie ein C++ - Modell, wenn Sie die Modelldaten auf der C++ - Seite möchten. – dtech

+0

Ich mache Automatisierungstests, ich kann keine Modelldaten für die Validierung verwenden, daher muss ich nach der Anzeige der Listenansicht in qml die Daten von qml nach C++ extrahieren und validieren. – Ashif

+0

Ich bezweifle, dass es funktioniert, wie Sie erwarten, Sie haben bessere Chancen, die Listview in QML zu iterieren und den Text an C++ senden, indem Sie es an eine Slot-Funktion übergeben. – dtech

Antwort

2

verwenden Sie können mit der objectNameEigenschaft für einen bestimmten Artikel in QML suchen. Lassen Sie sich eine einfache QML-Datei einen Blick:

//main.qml 
Window { 
    width: 1024; height: 768; visible: true 
    Rectangle { 
     objectName: "testingItem" 
     width: 200; height: 40; color: "green" 
    } 
} 

Und in C++, nehmen engine ist die QQmlApplicationEngine die main.qml lädt, können wir leicht testingItem finden, indem Sie den QObject Baum von QML Stammelement der Suche QObject::findChild mit:

//C++ 
void printTestingItemColor() 
{ 
    auto rootObj = engine.rootObjects().at(0); //assume main.qml is loaded 
    auto testingItem = rootObj->findChild<QQuickItem *>("testingItem"); 
    qDebug() << testingItem->property("color"); 
} 

Diese Methode kann jedoch nicht alle Elemente in QML finden, da einige Elemente möglicherweise kein QObject-Objekt haben. Zum Beispiel Delegierten in ListView oder Repeater:

ListView { 
    objectName: "view" 
    width: 200; height: 80 
    model: ListModel { ListElement { colorRole: "green" } } 
    delegate: Rectangle { 
     objectName: "testingItem" //printTestingItemColor() cannot find this!! 
     width: 50; height: 50 
     color: colorRole 
    } 
} 

für die Delegierten in ListView haben wir die visual child anstelle des Objekts Kind zu suchen. ListView Delegierte werden an ListViews contentItem weitergeleitet. Also in C++ haben wir für die ListView erste (mit QObject::findChild) zu suchen, und suchen Sie dann für die Teilnehmer in contentItemQQuickItem::childItems mit:

//C++ 
void UIControl::printTestingItemColorInListView() 
{ 
    auto view = m_rootObj->findChild<QQuickItem *>("view"); 
    auto contentItem = view->property("contentItem").value<QQuickItem *>(); 
    auto contentItemChildren = contentItem->childItems(); 
    for (auto childItem: contentItemChildren) 
    { 
     if (childItem->objectName() == "testingItem") 
      qDebug() << childItem->property("color"); 
    } 
}