четверг, 25 марта 2010 г.

DirectMapTableModel

От DirectMap легко породить модель для представления данных.
DirectMapTableModel - представляет простую таблицу из 2-х колонок.
В первой колонке - ключи мапа, во второй - значения.
Это нечто вроде QStringListModel, только с двумя колонками вместо одной.


#ifndef DIRECTMAPTABLE_H
#define DIRECTMAPTABLE_H

#include <QAbstractTableModel>
#include <DirectMap>

//---------------------------------------------------------------------
template <class Key, class Value>
class DirectMapTableModel : public QAbstractTableModel
{
public:
  //! Конструктор модели для DirectMap
  DirectMapTableModel(const DirectMap<Key, Value> & map, QObject * parent = 0);
 
  //! Установить заголовок
  void setHeaders(const QString & header1, const QString & header2)
  {
   header1_ = header1;
   header2_ = header2;
  }
protected:
  //! Количество строк
  virtual int rowCount(const QModelIndex & = QModelIndex()) const
  {
   return map_.count();
  }
  //! Количество колонок - для мапа их всегда 2
  virtual int columnCount(const QModelIndex & = QModelIndex()) const
  {
   return 2;
  }
  //! возвращаем данные
  virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
 
  virtual QVariant headerData(int section,
                Qt::Orientation orientation,
                int role = Qt::DisplayRole) const;

  //! Наш DirectMap
  const DirectMap<Key, Value> map_;
  //! Заголовки
  QString header1_;
  QString header2_;
};
//---------------------------------------------------------------------
template <class Key, class Value>
DirectMapTableModel<Key, Value>::DirectMapTableModel
( const DirectMap<Key, Value> & map, QObject * parent )
: QAbstractTableModel(parent), map_(map)
{
}
//---------------------------------------------------------------------
template <class Key, class Value>
QVariant DirectMapTableModel<Key, Value>::data
(const QModelIndex & index, int role) const
{
  if (!index.isValid())
   return QVariant();

  if (role == Qt::DisplayRole)
  {
   if (index.column() == 0)
   {
     return map_.key(index.row());
   }
   else if (index.column() == 1)
   {
     return map_.value(index.row());
   }
  }
  return QVariant();
}
//---------------------------------------------------------------------
template <class Key, class Value>
QVariant DirectMapTableModel<Key, Value>::headerData(int section,
  Qt::Orientation orientation, int role) const
{
  if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
  {
   if (section == 0)
     return header1_;
   else if (section == 1)
     return header2_;
  }
  return QAbstractTableModel::headerData(section, orientation, role);
}
//---------------------------------------------------------------------

#endif

* This source code was highlighted with Source Code Highlighter.


Единственное, нужно расширить DirectMap функциями
template <class Key, class Value>
class DirectMap : private QList<QPair<Key, Value> >
{
public:
//.................................
  //! Количество строк
  int count() const
  {
   return QList::count();
  }
  //! Возвратить ключ определенной строки
  Key key(int row) const;
  //! Возвратить значение определенной строки
  Value value(int row) const;
//.................................
};
//---------------------------------------------------------------------
template <class Key, class Value>
Key DirectMap<Key, Value>::key(int row) const
{
  QPair<Key, Value> pair = QList::at(row);
  return pair.first;
}
//---------------------------------------------------------------------
template <class Key, class Value>
Value DirectMap<Key, Value>::value(int row) const
{
  QPair<Key, Value> pair = QList::at(row);
  return pair.second;
}
//---------------------------------------------------------------------

* This source code was highlighted with Source Code Highlighter.

Пример использования
   //Создаем мап
   DirectMap<QString, QString> dmap;
   dmap.append(tr("Last Name"), lname);
   dmap.append(tr("First Name"), fname);
   dmap.append(tr("Middle Name"), pname);
   dmap.append(tr("Sex"), psex);
   dmap.append(tr("Birthday"), pdateb);
   dmap.append(tr("Place of Residence"), paddr);
   //Создаем модель
   DirectMapTableModel<QString, QString> * dmapTableModel
     = new DirectMapTableModel<QString, QString>(dmap, this);
   //Назначаем ей заголовок
   dmapTableModel->setHeaders(tr("Key"), tr("Value"));
   //Устанавливаем модель на представление
   tableView->setModel(dmapTableModel);

* This source code was highlighted with Source Code Highlighter.

Комментариев нет:

Отправить комментарий