[Development] QML and QAbstractListModel
Charley Bay
charleyb123 at gmail.com
Thu Jan 10 20:06:12 CET 2013
Alberto sayeth:
> > Hi all!
> > I'd like to make C++ models more usable from QML; in the net there
> > are several blog posts illustrating how to achieve that, but IMHO it
> > would be better if at least some of these handy features were in
> > QAbstractListModel itself:
> >
> > - "count" property
> > - "get(index)" invocable method, returning a QVariantMap mapping all the
> > roles to their data for the specified index
>
Alan respondeth:
> +1 from me, those would clearly make it more QML-friendly.
>
> > Also, though not very often requested, we could add:
> > - "remove(index)" which just calls QAbstractItemModel::removeRow()
> > - "QList<QVariant> items(const QString &role)", which returns the data
> > for the role "role" for all items.
>
> I'm on the fence about adding those. Since they wouldn't be commonly
> used, maybe it would be better to wait until there's time for a more
> holistic 'models in QML' update (which likely means waiting a long
> while, but eventually QML and QtQuick will need to deal with the issue
> of full tree model support).
>
> > The implementation for the above is fairly trivial, so I wonder if
> > there's some other reasons why it hasn't been done or if it's just that
> > no one did and a patch is welcome.
>
> To my knowledge it's the latter. There's a lot of Qt API which could
> be made more QML friendly, especially in this way (just adding
> properties and convenience functions, for when a user subclass is
> exposed to QML).
>
Funny this should be posted -- I'm coding a "wrapper" for a bunch of
app-specific QML/QAIM right now.
I assume we are all referencing Chris' blog post from two years ago:
http://cdumez.blogspot.com/2010/11/how-to-use-c-list-model-in-qml.html
...and BenoƮt's referencing blog from a year ago with some "extensions":
http://bsauts-en.blogspot.com/2011/09/listmodel-in-c-exposed-to-qml.html
...and stuff like QML "read/write (role)" updates:
http://qt-project.org/forums/viewthread/21787/
...and making a "model" a property of an item within another "model":
http://qt-project.org/forums/viewthread/6906
There's not tons of C++QAIM/QML blog posts out there, so please jump in if
you know of others. Generally, I'm trying to understand
"accepted-convention" regarding these, and implement my "template-wrappers"
which look like:
QAbstractItemModel
=> (derive) MyItemModel (abstract with signals/slots/properties)
=> (derived) MyItemModelBase<> (template with app-specific hooks
possible)
=> (derived) MyAppSpecificModel (many of these)
This is a pattern I've used quite a lot with Qt (others have also), and it
works:
- MyItemModel implements stuff I always want "extended", has
signals/slots/properties, and runs through "moc"
- MyItemModelBase<> does NOT run through "moc" (it's a template, you
can't), but has common implementation that may be "overridden" in
application-specific-type-derived-cases. (Derived classes merely override
the MyItemModelBase<>::SomeFunc())
- MyAppSpecificModel - may run through "moc", but usually I don't need
additional "signals/slots/properties" (anything needed was commonly
provided in "MyItemModel").
What's interesting about the QAIM/QML thing (to me) is abstracting the
concept of the "Item-within-the-Model" with "properties/roles" exposed to
QML. Chris' example illustrated this with his "ListItem" (derived from
"QObject"). But, I think it would more generically be handled with that
common pattern I tend to use:
QObject
=> MyModelItem (with "signals/slots/properties")
=> MyModelItemBase<> (template, no "moc")
=> MyAppSpecificItem (many of these)
QUESTION: Alan seems to suggest the (C++) QAIM/QML might be
changed/updated in the "near-future" (and that was the purpose for the
question in this thread). Is that to handle the "model" or the "item", or
"both"?
QUESTION #2: I *assumed* (perhaps wrongly) that QAbstractItemModel DID NOT
have "Q_PROPERTY()" things because the "Q_PROPERTY()" is purported to
expose attributes to QML. I see "Q_PROPERTY()" as an "adapter-to-QML".
So, it seemed obvious (to me) that all "Q_PROPERTY()" things would go into
"MyItemModel", and not the "QAbstractItemModel" itself. Any
"common-properties" (like "count()" and "get(int)") could similarly be in a
derived "QAbstractItemModelWrappedForQml". Is the intent to make it
"open-season" on adding "Q_PROPERTY" things to other C++ classes, for those
attributes to be exposed to QML? I'm not sure that's a good idea, because
it seems like the "act-of-wrapping/exporting" to QML is a very different
level API than the act of C++ interfacing with the primitive C++ class.
(This isn't a strongly held view, it's just my current impression.)
An additional design need I have is for "generic-sets-of-things" to be
"referenced" by "MyAppSpecificModel" instances, so that adding/changing the
"set" is "reflected" in the QML. I'm pretty sure this can be implemented
in a generic fashion with the pattern listed above. I wouldn't do this
work, or I would "retire" this work, if Qt-proper were going to take that
on. My specific work is for these design goals:
- App-specific "model" that "reflects" the "set-of-app-specific-items"
(with all relevant "updates" into QML when an item-in-the-set-changes)
- App-specific "model" is implicitly composed of app-specific "items" with
their own unique "roles/properties" exposed to QML (very important so QML
delegates can be written)
- App-specific "model" is defined with only a few lines of code (e.g.,
derive from template-base)
Is anyone else doing work like this? For example, I could consider using
classes like:
- QAbstractItemList
=> QAbstractItemListWithQmlProperties (FICTITIOUS)
- QItemForModelExposedToQml (FICTITIOUS)
...although I use templates quite a lot as the "base" class because the
"re-use" is higher, and the implementation does not go through virtual
functions. (This pattern is done by me and others, but is not commonly
seen within the Qt code base itself.)
--charley
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20130110/9c220fd4/attachment.html>
More information about the Development
mailing list