Вообще-то 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
#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;
}
#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
#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;
}