Вообще-то QModelIndex ссылается на ячейку в конкретной плоскости. Как следствие - идентифицируется однозначно.
Идентифицироваться однозначно будет как я понимаю, только в случае если указать третий параметр ф-ции:
createIndex( int row, int column, void *ptr = 0)
мне интересно как это происходит, третий параметр должен указывать на сам объект (Item)? А может есть способ имея только указатель на объект модели получить его индекс?
Проверял, что в твоем коде возвращает item->setData(data)?
ни чего не возвращает
Я код немного изменил ...
В main`не вызывается ф-ция:
QString str = "Hello";
model.appendItem(QVariant::fromValue(str));
В модель значение добавляется и отображается в View, проверял, вызовом в main`не ф-ции View->setModel(&model);
А модель стандартная из qt примера:
treeitem.h#if !defined TREEITEM_H
#define TREEITEM_H
#include <QList>
#include <QVariant>
#include "../serialport.h"
class TreeItem
{
public:
TreeItem(const QList<QVariant> &data, TreeItem *parent = 0);
~TreeItem();
void appendChild(TreeItem *child);
TreeItem *child(int row);
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
int row() const;
TreeItem *parent();
void setData(const QList<QVariant> &data);
private:
QList<TreeItem *> childItems_;
QList<QVariant> itemData_;
TreeItem *parentItem_;
};
#endif
treeitem.cpp#include <QStringList>
#include "treeitem.h"
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
{
parentItem_ = parent;
itemData_ = data;
}
TreeItem::~TreeItem()
{
qDeleteAll(childItems_);
}
void TreeItem::appendChild(TreeItem *item)
{
childItems_.append(item);
}
TreeItem *TreeItem::child(int row)
{
return childItems_.value(row);
}
int TreeItem::childCount() const
{
return childItems_.count();
}
int TreeItem::columnCount() const
{
return itemData_.count();
}
QVariant TreeItem::data(int column) const
{
return itemData_.value(column);
}
TreeItem *TreeItem::parent()
{
return parentItem_;
}
int TreeItem::row() const
{
if (parentItem_)
return parentItem_->childItems_.indexOf(const_cast<TreeItem*>(this));
return 0;
}
void TreeItem::setData(const QList<QVariant> &data)
{
itemData_ = data;
}
treemodel.h#if !defined TREEMODEL_H
#define TREEMODEL_H
#include <QAbstractItemModel>
#include <QModelIndex>
#include "../treemodel/treeitem.h"
class TreeModel : public QAbstractItemModel
{
Q_OBJECT
public:
TreeModel(QObject *parent = 0);
~TreeModel();
QVariant data(const QModelIndex &index, int role) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &index) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
bool appendItem(const QVariant &value, const QModelIndex &parent = QModelIndex(), int role = Qt::EditRole);
private:
TreeItem *rootItem_;
};
#endif
treemodel.cpp#include <QtGui>
#include "treeitem.h"
#include "treemodel.h"
TreeModel::TreeModel(QObject *parent)
:QAbstractItemModel(parent)
{
QList<QVariant> rootData;
rootData<<"Net";
rootItem_ = new TreeItem(rootData);
}
TreeModel::~TreeModel()
{
delete rootItem_;
}
int TreeModel::columnCount(const QModelIndex &parent) const
{
if (parent.isValid())
return static_cast<TreeItem *>(parent.internalPointer())->columnCount();
else
return rootItem_->columnCount();
}
QVariant TreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role != Qt::DisplayRole)
return QVariant();
TreeItem *item = static_cast<TreeItem *>(index.internalPointer());
return item->data(index.column());
}
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::ItemIsEnabled;
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if ((orientation == Qt::Horizontal) && (role == Qt::DisplayRole))
return rootItem_->data(section);
return QVariant();
}
QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const
{
TreeItem *parentItem;
if (!parent.isValid())
parentItem = rootItem_;
else
parentItem = static_cast<TreeItem *>(parent.internalPointer());
TreeItem *childItem = parentItem->child(row);
if (childItem)
return createIndex(row, column, childItem);
else
return QModelIndex();
}
QModelIndex TreeModel::parent(const QModelIndex &index) const
{
if (!index.isValid())
return QModelIndex();
TreeItem *childItem = static_cast<TreeItem *>(index.internalPointer());
TreeItem *parentItem = childItem->parent();
if (parentItem == rootItem_)
return QModelIndex();
return createIndex(parentItem->row(), 0, parentItem);
}
int TreeModel::rowCount(const QModelIndex &parent) const
{
TreeItem *parentItem;
if (!parent.isValid())
parentItem = rootItem_;
else
parentItem = static_cast<TreeItem *>(parent.internalPointer());
return parentItem->childCount();
}
bool TreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid())
return false;
QList<QVariant> data;
data<<value;
TreeItem *item = static_cast<TreeItem *>(index.internalPointer());
item->setData(data);
emit dataChanged(index, index);
return true;
}
bool TreeModel::appendItem(const QVariant &value, const QModelIndex &parent, int role)
{
TreeItem *parentItem;
if (!parent.isValid())
parentItem = rootItem_;
else
parentItem = static_cast<TreeItem *>(parent.internalPointer());
QList<QVariant> data;
data<<value;
TreeItem *item = new TreeItem(data, parentItem);
parentItem->appendChild(item);
QModelIndex index = createIndex(parentItem->childCount(), 0, item);
emit dataChanged(index, index);
return true;
}