On 20/01/16 01:23, Andrew den Exter wrote:
On Wed, Jan 20, 2016 at 2:13 AM, Stephen Kelly <stephen.ke...@ableton.com <mailto:stephen.ke...@ableton.com>> wrote:

    The solution could be to cache data retrieved from the model.


That's a more complex solution than you might think. It's a pretty popular pattern to populate a model with QObjects for example and with a naive cache of QVariants what was an admittedly annoying binding evaluation error becomes a much more severe dereference of a dangling pointer.


Indeed. What I have been considering is limiting the types which are cached to those which can directly be put into a user interface element - built in types like strings, numbers, colors etc. Maybe even any gadget.

It could be possible to special case model data which is-a OQbject pointer (QMetaType has API for that) and cache that too, but then we'd just be caching null pointers, so thinking this through leads me to think that's not useful.

That's the kind of design discussion that I would like to have in this thread though (as it is easier in email than in gerrit), so thanks for that.

And there are the obvious runtime costs to building and maintaining a cache that is of little or no use to most people most of the time, which is I think a strong argument for it being an off by default feature if implemented.


I think the cost would need to be measured before letting it influence design decisions. We are not talking about monstrous amounts of data.

If you do have this problem, right now the solution is to bind the model value to a property in your delegate and use the property in your binding.

Indeed. That is an ad-hoc cache that a client can implement. It doesn't really scale well as a design, or as guidance for a team of developers.

The property binding will only be re-evaluated when the model data changes so it won't ever try and access the model after the row has been removed.


Yes, semantically this is quite similar to what I propose, but is not scalable.

It is an issue and by all means investigate a solution, but there is a simple means to deal with it at a user level and I'm personally wary of the complexity and repercussions of fixing it in the views.

I don't think that solution is

* intuitive
* maintainable in a changing team
* easy to get right/hard to get wrong

so I don't really agree that it is 'simple'.

Thanks,

Steve.

_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to