[Development] Role names and Proxy Models

Stephen Kelly stephen.kelly at kdab.com
Mon Jan 16 02:13:44 CET 2012


On Friday, January 13, 2012 22:37:16 Johan Thelin wrote:
> Hi all,
> 
> I've been constructing a proxy model that hides multiple underlying
> models. In this process, I have to translate the custom roles for each
> model. E.g. the custom role enumeration for the duration of a music
> track is not the same as for an album, but when accessed through my
> proxy model, it should be. This is where I encountered an issue with
> the current proxy models (in Qt 4.8).
> 
> The role names for the model being proxied is copied each time
> setModel is called. This means that the role names might change while
> the model lives - something that does not work well with QML (as is
> pointed out by the documentaiton). It also means that any calls to
> setRoleNames in the c'tor of the proxy model are futile - the roles
> are replaced when a model is set.
> 
> In my opinion, this behavior should not be enforced at the current
> level, i.e. in QAbstractProxyModel, but rather, in each specific
> implementation, e.g. in QAbstractSortfFilterProxyModel, but not in
> QIdentityProxyModel, so that a role-tranforming-proxy, like the one I
> created, can be implemented.
> 
> Introducing this in the 4.x tree might be considered to break the API,
> but this is definitely something that I would like to see in Qt 5.
> Does anyone object to this? Or is it time to submit a small patch?
> 

I'm not sure what your actual proposal is?

If a model changes its rolenames then it should emit signals about being 
reset. If it emits signals about being reset, then QML should re-read the 
rolenames (note that proxies are not relevant in those sentences - the 
relevant API is QAbstractItemModel).

If QML doesn't re-read the rolenames when the model is reset, then there's a 
patch to be made in QtDeclarative. (QAbstractProxyModel doesn't re-read them 
on reset either. Ogoffart rejected my patch to make it do that for reasons 
which never made sense to me and which I now forget and can't find on the 
internet).

Anyway the Qt 5.0 way to set rolenames is to implement a virtual method. 
Please see if that addresses your concern, and if it doesn't, then please 
write an example which doesn't require a proxy which hides 'multiple 
underlying models'. That might not work anyway for various reasons (if you are 
using QAbstractProxyModel). Use an example such as 'a proxy model which 
returns a string filename for an image instead of a QImage for the decoration 
role'.

Thanks,

-- 
Stephen Kelly <stephen.kelly at kdab.com> | Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
www.kdab.com || Germany +49-30-521325470 || Sweden (HQ) +46-563-540090
KDAB - Qt Experts - Platform-Independent Software Solutions
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20120116/58851328/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.qt-project.org/pipermail/development/attachments/20120116/58851328/attachment.sig>


More information about the Development mailing list