[Qt-interest] Returning data from models

Benjamin Sonnemann b.sonnemann at gmail.com
Tue Apr 7 16:08:19 CEST 2009


Well i think you should take a look at
QVariant::fromValue(const T& value);


in conjunction with:

Q_DECLARE_METATYPE

Hope i understood you right

Benjamin Sonnemann


On Tue, Apr 7, 2009 at 2:53 PM, phil prentice <philp.cheer at talktalk.net>wrote:

> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20090407/dc4bc1aa/attachment.html 


More information about the Qt-interest-old mailing list