[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