Ich habe QAbstractListModel in C++ Code und verbunden mit qml Gridview von Butons mittelsQML: GridView.onReloaded Signal
QQmlApplicationEngine engine;
QQmlContext* context = engine.rootContext();
context->setContextProperty("keyboardModel", _keyboardModel);
Das Hauptziel ist die globalen Koordinaten von Buttons in C++ Code erhalten. Zu diesem Zweck finde ich diese Tasten mit QQuickItem::childItems()
Funktion und erhalten endgültige Koordinaten mit mapToGlobal()
.
Nun, wenn ich C++ - Modell geändert, qml GridView auch geändert. Aber, ich kann nicht Moment, wenn hierarchische QQuickItem Baum vollständig aufgefrischt (benötigt für die korrekte Arbeit QQuickItem::childItems()
)
GridView Signale onAdd, auf Entfernen funktioniert nicht, wenn das neue Modell hat die gleiche Anzahl von Elementen. GridViews Signal onModelChanged hat nur ausgelöst, wenn ich ein anderes Modell angeschlossen habe, nicht wenn ich dieses geändert habe.
Gibt es ein Signal zur Erkennung, wenn der hierarchische QQuickItem-Baum vollständig aktualisiert wurde? Oder gibt es eine andere Methode, um die globalen Koordinaten von Qmls Objekt dynamisch zu erhalten?
Warum möchten Sie die Koordinaten des Buttons in C++ haben? Normalerweise haben Sie das Datenmodell in C++ und die Ansicht in QML. Das Datenmodell sollte Sicht agnostisch sein. Weiter können * Sie * aber * QML nicht aus C++ abfragen. Lassen Sie die QML-Seite der C++ Seite mitteilen, was C++ wissen muss. – derM
Ich sollte es an eine andere App senden. – Nikxp
Eine 'GridView' verwendet dynamische Instanziierung, was bedeutet, dass Sie nicht sicher sein können, dass alle in Ihrem Modell definierten' Buttons' zu jedem Zeitpunkt instanziiert werden.Außerdem ist das 'GridView' ein' Flickable', so dass sich die Positionen beim Blättern ändern, wo es viele Änderungen für Tonnen von Objekten gibt. Wie werden Sie (konzeptionell) damit umgehen? Das liegt daran, dass Sie in Ihrer Frage nur * Entfernen und Hinzufügen * handhaben, anstatt herumzublättern. Wenn es eher statisch ist, sollten Sie stattdessen einen 'Repeater' und ein' Grid' betrachten. – derM