Название: 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#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; }
Название: Model/View: Принцип работы сигнала dataChanged(index, index)
Отправлено: bigirbis от Август 23, 2006, 12:14
На самом деле надо было просто на пример сослаться, т.к. ИМХО тяжело форум просматривать. Все, кто тебе может ответить Assistant'ом обладают.
Что касаемо получения строки и столбца, обратно же ИМХО, модель представлена деревом. Как следствие: дерево можно расположить как в строках, так и в столбцах. Отсюда и выставление значения строки и столбца. Обратно же, всякие сортировки - не думаю, что они связаны с сортировкой дерева...
Если заблуждаюсь, поправьте, пожалуйста...
|