Newby questions about QML models

Willem Ferguson willemferguson at zoology.up.ac.za
Mon Feb 1 06:49:12 PST 2016


May I ask a few questions about implementing QML models in C++? 
Apologies if I sound uninformed.

1) When a model is specified on the QML side, e.g. in

     ComboBox {
     model xxxxx;

     and that model is supplied by the C++ code, does the object 
returned by C++ have to a model object,
     e.g. a QStringListModel or a QAbstractListModel? Or could it be a 
simple QStringList in the case of a simple ListView or ComboBox?
     I suspect the former applies.

2) When the model is returned from C++ to QML, must this be performed by 
a C++ object that inherits from such a model class (e.g. 
QAbstractListModel) or could it be any class (i.e. inheriting from an 
arbitrary base class) that has an extractor method returning an 
appropriate model?

3) Related to the above, within the Download-from-dc context, is the 
model used by the QML is dependent on the specific standard built-in
    methods provided by one of the standard model classes (let's say 
QAbstractListModel) or can one implement an arbitrary extractor method 
that returns a model (e.g a QStringListModel). To me it looks like the 
latter is the case because QAbstracListModel does not have a standard 
built-in method that returns the complete list.

4) Within the existing main.qml, selecting "Show GPS fixes" activates 
the C++ qmlManager.populateGpsData() method that, in turn, activates
GpsListModel::instance()->update.  The appropriate (now updated) model 
is m_instance, returned by GpsListModel::instance().
[So syntactically  the :: operator has priority over the -> operator, 
because instance()->update() does not make sense.]
Is my understanding correct here?
Now, the actual display of GPS data is done in  gpsList.qml, using 
gpsModel as a model and formatted by gpsDelegate. But I cannot link 
gpsModel back to main.qml, QMLManager or to GpsListModel. Where is the 
link made between gpsModel in gpsList.qml and the underlying C++ code?
As discussed before I would have used 
ctxt->setContextProperty("gpsModel", 
QVariant::fromValue(gpsQStringList)) but this is clearly not the case here.

5) If I understand it correctly, one can let DownloadManager inherit 
from QAbstractListModel, then let DownloadManager have two extractor 
methods, getVendorModel() and getProductModel() that each return an 
appropriate and populated model, callable from QML. Does this make sense 
at all?

I hope my questions are clear, and thank you so much for your time in 
answering.
Kind regards,
willem









More information about the subsurface mailing list