Всем привет! Вот решил устранить темное для меня на данный момент времени место в Qt - модель/представление. Для теста делаю пример на основании файлов в заданном директории: таблицу, с 4-мя колонками - имя файла, создатель файла, время создания, время модификации. Количество строк - это количество файлов в директории. Вот написал такой класс:
#ifndef DIRFILEMODEL_H
#define DIRFILEMODEL_H
#include <QAbstractTableModel>
#include <vector>
#include <QDateTime>
class CDirFileModel : public QAbstractTableModel
{
//--------------------------------------------------------------------------------------------------//
struct TFile
{
TFile(const int& anIndex) : nIndex(anIndex)
{
}
int nIndex;
QString sFileName;
QString sFileAuthor;
QDateTime oCreated;
QDateTime oModifyed;
inline bool operator < (const TFile& rhs) const {return (nIndex < rhs.nIndex);}
inline bool operator > (const TFile& rhs) const {return (nIndex > rhs.nIndex);}
inline bool operator == (const TFile& rhs) const {return nIndex == rhs.nIndex;}
inline bool operator != (const TFile& rhs) const {return !operator ==(rhs);}
};
typedef std::vector<TFile> FileCollection;
//--------------------------------------------------------------------------------------------------//
FileCollection m_roFiles;
public:
CDirFileModel();
virtual QModelIndex index (int row, int column, const QModelIndex & parent = QModelIndex() ) const;
virtual bool setData (const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex());
virtual bool removeRows(int row, int count, const QModelIndex& parent);
};
#endif // DIRFILEMODEL_H
#include "./DirFileModel.h"
#include <algorithm>
//-----------------------------------------------------------------------------------------//
CDirFileModel::CDirFileModel()
{
}
//-----------------------------------------------------------------------------------------//
QModelIndex CDirFileModel::index (int row, int column, const QModelIndex & /*parent*/) const
{
return hasIndex(row, column) ? createIndex(row, column, 0) : QModelIndex();
}
//-----------------------------------------------------------------------------------------//
QVariant CDirFileModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() >=(int)m_roFiles.size()) return QVariant();
FileCollection::const_iterator itFile = std::find(m_roFiles.begin(), m_roFiles.end(), TFile(index.row()));
if (itFile == m_roFiles.end()) return QVariant();
switch (index.column())
{
case 0: return m_roFiles.at(index.row()).sFileName;
case 1: return m_roFiles.at(index.row()).sFileAuthor;
case 2: return m_roFiles.at(index.row()).oCreated;
case 3: return m_roFiles.at(index.row()).oModifyed;
}
return QVariant();
}
//-----------------------------------------------------------------------------------------//
bool CDirFileModel::setData (const QModelIndex & index, const QVariant & value, int role)
{
if (!index.isValid() || index.row() >=(int)m_roFiles.size()) return false;
FileCollection::iterator itFile = std::find(m_roFiles.begin(), m_roFiles.end(), TFile(index.row()));
if (itFile == m_roFiles.end()) return false;
switch (index.column())
{
case 0: {itFile->sFileName = value.toString(); return true;}
case 1: {itFile->sFileAuthor = value.toString(); return true;}
case 2: {itFile->oCreated = value.toDateTime(); return true;}
case 3: {itFile->oModifyed = value.toDateTime(); return true;}
}
return false;
}
//-----------------------------------------------------------------------------------------//
Qt::ItemFlags CDirFileModel::flags(const QModelIndex &index) const
{
if (!index.isValid()) return Qt::ItemIsEnabled;
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}
//-----------------------------------------------------------------------------------------//
int CDirFileModel::columnCount(const QModelIndex &/*parent*/) const
{
return 4;
}
//-----------------------------------------------------------------------------------------//
int CDirFileModel::rowCount(const QModelIndex &/*parent*/) const
{
return m_roFiles.size();
}
//-----------------------------------------------------------------------------------------//
bool CDirFileModel::insertRows(int row, int count, const QModelIndex & /*parent*/)
{
beginInsertRows(QModelIndex(), row, row + count - 1);
for (int nRow = 0; nRow < count; ++nRow)
{
m_roFiles.push_back(TFile(row));
}
endInsertRows();
return true;
}
//-----------------------------------------------------------------------------------------//
bool CDirFileModel::removeRows(int row, int count, const QModelIndex& /*parent*/)
{
beginRemoveRows(QModelIndex(), row, row + count - 1);
for (int nRow = 0; nRow < count; ++nRow)
{
FileCollection::iterator itFile = std::find(m_roFiles.begin(), m_roFiles.end(), TFile(nRow));
if (itFile != m_roFiles.end()) m_roFiles.erase(itFile);
}
endRemoveRows();
return true;
}
//-----------------------------------------------------------------------------------------//
Пробую заполнить модель данными:
m_pDirFileModel = new CDirFileModel();
m_pDirFileModel->insertRows(0, 2);
QModelIndex oIdx00 = m_pDirFileModel->index(0, 0); m_pDirFileModel->setData(oIdx00, "00");
QModelIndex oIdx01 = m_pDirFileModel->index(0, 1); m_pDirFileModel->setData(oIdx01, "01");
QModelIndex oIdx02 = m_pDirFileModel->index(0, 2); m_pDirFileModel->setData(oIdx02, QDateTime::currentDateTime());
QModelIndex oIdx03 = m_pDirFileModel->index(0, 3); m_pDirFileModel->setData(oIdx03, QDateTime::currentDateTime());
QModelIndex oIdx10 = m_pDirFileModel->index(1, 0); m_pDirFileModel->setData(oIdx10, "10");
QModelIndex oIdx11 = m_pDirFileModel->index(1, 1); m_pDirFileModel->setData(oIdx11, "11");
QModelIndex oIdx12 = m_pDirFileModel->index(1, 2); m_pDirFileModel->setData(oIdx12, QDateTime::currentDateTime());
QModelIndex oIdx13 = m_pDirFileModel->index(1, 3); m_pDirFileModel->setData(oIdx13, QDateTime::currentDateTime());
ui.tableView->setModel(m_pDirFileModel);
В итоге вижу заполненную только 1-ю строку таблицы, и больше ничего... И то она выводится так, как будто в ячейках checkBox-ы установлены (только на них не нажать). В чем моя ошибка?
Спасибо)
Сообщение отредактировал Rocky - 6.12.2010, 16:22