Russian Qt Forum
Май 03, 2024, 21:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Model/View: Принцип работы сигнала dataChanged(index, index)  (Прочитано 8323 раз)
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;
}
Записан
bigirbis
Гость
« Ответ #1 : Август 22, 2006, 16:18 »

Цитировать
А что, если модель представляет собой дерево, какой элемент будет перерисован?

Вообще-то QModelIndex ссылается на ячейку в конкретной плоскости. Как следствие - идентифицируется однозначно.

добавлено спустя 2 минуты:

 Проверял, что в твоем коде возвращает item->setData(data)?
Записан
fear
Гость
« Ответ #2 : Август 22, 2006, 18:51 »

Цитата: "bigirbis"
Вообще-то QModelIndex ссылается на ячейку в конкретной плоскости. Как следствие - идентифицируется однозначно.


Идентифицироваться однозначно будет как я понимаю, только в случае если указать третий параметр ф-ции:
createIndex( int row, int column, void *ptr = 0)
мне интересно как это происходит, третий параметр должен указывать на сам объект (Item)? А может есть способ имея только указатель на объект модели получить его индекс?

Цитата: "bigirbis"
Проверял, что в твоем коде возвращает 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;
}
Записан
bigirbis
Гость
« Ответ #3 : Август 23, 2006, 12:14 »

На самом деле надо было просто на пример сослаться, т.к. ИМХО тяжело форум просматривать. Все, кто тебе может ответить Assistant'ом обладают.

Что касаемо получения строки и столбца, обратно же ИМХО, модель представлена деревом. Как следствие: дерево можно расположить как в строках, так и в столбцах. Отсюда и выставление значения строки и столбца. Обратно же, всякие сортировки - не думаю, что они связаны с сортировкой дерева...

Если заблуждаюсь, поправьте, пожалуйста...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 20.