How to use QAbstractListModel

From Qt Wiki
Revision as of 06:26, 15 September 2020 by Vladimir Kryachko (talk | contribs) (QAbstractItemModel::rowCount and QAbstractItemModel::columnCount return int, not void.)
Jump to navigation Jump to search

The following tutorial explains how to create a custom Qt model and use it inside a QTableView.

We want to display a user list. First create a simple User class as follow :

class User 
{
  public : 
     User();
     User(const QString& firstname, const QString& lastname, const QDate& birthday);   
  private:
     QString mFirstname; 
     QString mLastName;
     QDate mBirthday;

}

We are now going to create a model based on QAbstractItemModel. A model is an interface between the view and the data. In the following example, data are a list of User.

class UserModel : public QAbstractItemModel 
{
   Q_OBJECT
  public : 
     UserModel(QObject * parent = 0);
     int rowCount(const QModelIndex& parent = QModelIndex()) const;
     int columnCount(const QModelIndex& parent = QModelIndex()) const;
     QVariant data(const QModelIndex &index, int role) const;
     void populate();

  private:
    QList<User> mDatas;

}
    int UserModel::rowCount(const QModelIndex& parent = QModelIndex()) const
    {
       return mDatas.size();
    }

    int UserModel::columnCount(const QModelIndex& parent = QModelIndex()) const
    {
       return 3;
    }

   QVariant UserModel::data(const QModelIndex &index, int role) const
   {
    if (!index.isValid())
        return QVariant();

    if ( role == Qt::DisplayRole)
    {
        if ( index.column() == 0)
            return mDatas[index.row()].firstname();

        if ( index.column() == 1)
            return mDatas[index.row()].lastname();

       if ( index.column() == 2)
            return mDatas[index.row()].birthday();
    }

    return QVariant();

}

   void UserModel::populate()
   {
         beginResetModel();
         mDatas.clear();
         mDatas.append(User("Charles","Darwin", QDate(1812,22,23));
         mDatas.append(User("Lars","Knoll,"QDate(1976,22,12));
         mDatas.append(User("Boby","Lapointe",QDate(1951,21,31));
         endResetModel();
   }

Now use your mode :

QTableView * view = new QTableView;
UserModel * model = new UserModel;
view->setModel(model);
model->populate()