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.
Комментариев нет:
Отправить комментарий