| 
 Название: Model/View: Принцип работы сигнала dataChanged(index, index)
 Отправлено: fear от Августа 22, 2006,  15:49
 
 Возник вопрос: Например если модель представляет собой таблицу, то при генерации сигнала dataChanged(index, index), где индекс допустим QModelIndex index = createIndex(1,2), перерисуется эта ячейка:      0    1    2    3    ------------------- 0  | - || - || - || - |    -------------------    ------------------- 1  | - || - || x || - |    -------------------    ------------------- 2  | - || - || - ||-  |    -------------------    ------------------- 3  |-  ||-  ||-  || - |    ------------------- А что, если модель представляет собой дерево, какой элемент будет перерисован?      root      |      |--- item A      |      +--- item B      |      |      |      |--- item ca      |      |      |      |--- item cb      |      |      |      |--- item cc      |      +--- item C             |            |--- item ca            |            |--- item cb Да и по какой причине может не обновляться модель, вслучае со следующей функцией, если данные она успешно добавляет в модель? ... 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;
 }
 Название: Model/View: Принцип работы сигнала dataChanged(index, index)
 Отправлено: bigirbis от Августа 22, 2006,  16:18
 
 А что, если модель представляет собой дерево, какой элемент будет перерисован? Вообще-то QModelIndex ссылается на ячейку в конкретной плоскости. Как следствие - идентифицируется однозначно. добавлено спустя 2 минуты:  Проверял, что в твоем коде возвращает item->setData(data)?
 Название: Model/View: Принцип работы сигнала dataChanged(index, index)
 Отправлено: fear от Августа 22, 2006,  18:51
 
 Вообще-то 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 treeitem.cpp#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
treemodel.h#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.cpp#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;
 }
 Название: Model/View: Принцип работы сигнала dataChanged(index, index)
 Отправлено: bigirbis от Августа 23, 2006,  12:14
 
 На самом деле надо было просто на пример сослаться, т.к. ИМХО тяжело форум просматривать. Все, кто тебе может ответить Assistant'ом обладают.
 Что касаемо получения строки и столбца, обратно же ИМХО, модель представлена деревом. Как следствие: дерево можно расположить как в строках, так и в столбцах. Отсюда и выставление значения строки и столбца. Обратно же, всякие сортировки - не думаю, что они связаны с сортировкой дерева...
 
 Если заблуждаюсь, поправьте, пожалуйста...
 
 
 |