Hi, Il 19/10/19 23:48, Dirk Hohndel ha scritto:
That is of course ridiculously inefficient. Even ignoring the issue on my side that forces me to run the constructor every time the data() function is called, it seems silly to not just be able to have a local copy of that object for the delegate QML object which then accesses the members of that object without calling back to the underlying model.Is there a way to do that and I just didn't find it when looking?
Note that, in general, a model's data() function is expected to be seriously hammered by a view. In Qt's model/view architecture, views and delegates don't cache anything. (This is brought quite to the extreme: it's not uncommon to see hundreds if not thousands of calls to data() from a widgets view simply by moving the mouse cursor over it.)
If there's need of caching because accessing the data is "slow", for any measure of slow, then this caching belongs to the model (or to the user's own delegates/views).
Thus, the way I see it, you have two options:1) Add some caching to your model's data(), e.g. a very simple LRU cache of a reasonably small size, as proposed in the earlier reply.
2) Given that in QML you write the delegates yourself, maybe instead of using something like:
delegate: MyDelegate { propA: model.role.fieldA propB: model.role.fieldB // etc }which will likely cause multiple calls to data() for the rolename "role" for the same delegate instance, did you try something like this?
delegate: MyDelegate { readonly property QtObject myObject: model.role // or, "var" propA: myObject.fieldA propB: myObject.fieldB // etc. } HTH, -- Giuseppe D'Angelo | giuseppe.dang...@kdab.com | Senior Software Engineer KDAB (France) S.A.S., a KDAB Group company Tel. France +33 (0)4 90 84 08 53, http://www.kdab.com KDAB - The Qt, C++ and OpenGL Experts
smime.p7s
Description: Firma crittografica S/MIME
_______________________________________________ Interest mailing list Interest@qt-project.org https://lists.qt-project.org/listinfo/interest