[Qt-interest] Returning data from models

Scott Aron Bloom Scott.Bloom at sabgroup.com
Tue Apr 7 16:15:20 CEST 2009


Create a data object, that has the insName, facName etc...

Then have a list of data objects.

Then create an enum
enum BottomArrowModelRole 
{
InstrumentRole=UserRole+1
FacilityRole,
.
.
.
}

So you don't have to remember the order in one huge case statement.

Then in the setData and data, get the object, and call setData and
getData of the role.

Scott



> -----Original Message-----
> From: qt-interest-bounces at trolltech.com [mailto:qt-interest-
> bounces at trolltech.com] On Behalf Of phil prentice
> Sent: Tuesday, April 07, 2009 5:53 AM
> To: qt-interest at trolltech.com
> Subject: [Qt-interest] Returning data from models
> 
> Hi
>   If this is more a C++ question then a QT one, then I apologise up
front now
> and you can ignore me!!!  I have a declared a class derived from
> QAbstractListModel.  The code works fine, but as a novice I am just
trying to
> improve what I have.  My problem is that I have a list data associated
with
> my model and I am using the roles UserRole+n to access the data.
> Here is some of the code:-
> 
> class BottomArrowModel : public QAbstractListModel
> {
>     Q_OBJECT
> 
> public:
>     BottomArrowModel(QObject *parent = 0);
> 
>     /* Over-ride functions. */
>     bool setData(const QModelIndex &index, const QVariant &value,
>                                               int role =
Qt::EditRole);
>     bool insertRows(int position, int rows,
>                               const QModelIndex &index =
QModelIndex());
>     bool removeRows(int position, int rows,
>                               const QModelIndex &index =
QModelIndex());
>     int rowCount(const QModelIndex &parent = QModelIndex()) const;
>     QVariant data(const QModelIndex &index, int role =
Qt::DisplayRole) const;
>     inline void setZoomFactor(int zoom) {m_zoomFactor = zoom;
>                                                 emit layoutChanged();
};
>     inline int zoomFactor() {return m_zoomFactor;};
> 
> private:
>     int m_zoomFactor; /* 1, 2 or 4 */
>     QStringList instNameList;  /* My data consists of a list of items
each */
>     QStringList facNameList;  /* one having an entry for the 6 items
on */
>     QStringList remarkList;    /* the left. */
>     QStringList commentList;
>     QStringList componentList;
>     QStringList signalList;
> };
> 
> 
> bool BottomArrowModel::setData(const QModelIndex &index,
>                                         const QVariant &value, int
role)
> {
>   if (index.isValid())
>   {
>     switch(role)
>     {
>       case Qt::UserRole: /* Instrument name. */
>         instNameList.replace(index.row(), value.toString());
>         break;
>       case Qt::UserRole+1: /* Facility name. */
>         facNameList.replace(index.row(), value.toString());
>         emit dataChanged(index, index);
>           /* Let the views know of changes..data changed signal
emitted. */
>         break;
>       case Qt::UserRole+2: /* Remark. */
>         remarkList.replace(index.row(), value.toString());
>         emit dataChanged(index, index);
>           /* Let the views know of changes..data changed signal
emitted. */
>         break;
>       case Qt::UserRole+3: /* Comment. */
>         commentList.replace(index.row(), value.toString());
>         emit dataChanged(index, index);
>           /* Let the views know of changes..data changed signal
emitted. */
>         break;
>       case Qt::UserRole+4: /* Component. */
>         componentList.replace(index.row(), value.toString());
>         emit dataChanged(index, index);
>           /* Let the views know of changes..data changed signal
emitted. */
>         break;
>       case Qt::UserRole+5: /* Signal. */
>         signalList.replace(index.row(), value.toString());
>         emit dataChanged(index, index);
>           /* Let the views know of changes..data changed signal
emitted. */
>         break;
>       default: /* Ignore anything else. */
>         return false;
>     }
>     return true;
>   }
>   return false;
> }
> 
> 
> /* Use model to obtain data. */
> QVariant BottomArrowModel::data(const QModelIndex &index, int role)
const
> {
>   if (!index.isValid())
>     return QVariant();
> 
>   if (index.row() >= facNameList.size())
>     return QVariant();
> 
>   switch(role)
>   {
>     case Qt::UserRole: /* Instrument name. */
>       return instNameList.at(index.row());
>       break;
>     case Qt::UserRole+1: /* Facility name. */
>       return facNameList.at(index.row());
>       break;
>     case Qt::UserRole+2: /* Remark string. */
>       return remarkList.at(index.row());
>       break;
>     case Qt::UserRole+3: /* Comment string. */
>       return commentList.at(index.row());
>       break;
>     case Qt::UserRole+4: /* Component string. */
>       return componentList.at(index.row());
>       break;
>     case Qt::UserRole+5: /* Signal string. */
>       return signalList.at(index.row());
>       break;
>     default: /* Ignore anything else. */
>       return QVariant();
>   }
> }
> 
> My concern lies in that the above works OK, but what if I had say 100
> different items to update and they were all of a different type.  I am
sure
> that there is probably a better way, maybe using QLIst<T>?
> 
> The thing is ..is that data and setData uses the object QVariant to
pass the
> data in and out.  Is there a way to pass a class object (myClass) as
Qvariant
> and store these objects in a list QList<T>.  Then my delegate and view
etc
> could access the model the once to get the data for one item in the
list in
> the form of myClass.  That class could be used to access the
individual items
> of data in the model.  I could also probably set the data in a similar
> read/write way.
> 
> What I have got just does not seem very clever...can anybody educate
me here,
> or point me to an example?
> 
> Thanks
> 
> Phil Prentice
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest




More information about the Qt-interest-old mailing list