Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Icoz от Сентябрь 06, 2007, 15:44



Название: [qt4.3.1] Обновление при изменениях в QTreeView+MyModel
Отправлено: Icoz от Сентябрь 06, 2007, 15:44
Пробслема следующая.
Модель пишу сам:
Код:
class NotesModel : public QAbstractItemModel
{
Q_OBJECT
public:
NotesModel(QString filename = "", QObject *parent = 0);
~NotesModel( ) { delete root; }
// functions for MODEL
 // functions for drag-drop support
Qt::DropActions supportedDropActions() const;
Qt::ItemFlags flags(const QModelIndex &index) const;
bool dropMimeData(const QMimeData *data, Qt::DropAction action,
                int row, int column, const QModelIndex &parent);
QMimeData *mimeData(const QModelIndexList &indexes) const;
QStringList mimeTypes() const;
 // functions for model-viewing
QModelIndex index(int row, int column, const QModelIndex &parent) const;
QModelIndex parent(const QModelIndex &child) const;

int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole );
...
};
Проблема в фунциях при обновлении данных.
Код:
void NotesModel::AddNote(QString name, Note *parent, QString content)
{
Note *note = new Note(getNewID(),name,content,parent);
parent->children.append(note);
saveNoteToDB(note);
reset();
}

void NotesModel::AddNote(QString name, QModelIndex &parent, QString content)
{
AddNote(name,noteFromIndex(parent),content);
QModelIndex br = createIndex(parent.row(),parent.column(),noteFromIndex(parent));
emit dataChanged(parent,br);
}
Кое-где, где мне известен index там я могу вызвать сигнал, там же, где у меня указатель  на мои структуры, я не могу сделать индекс. Может кто расскажет, как правильно пользоваться createIndex? Ибо сам я его вызовы тупо подергал из доки. Сам пытаюсь что-то сделать - не работает. :(
Вот так я получаю указатель на свою структуру:
Код:
Note* NotesModel::noteFromIndex(const QModelIndex &index) const
{
if (index.isValid())
return static_cast<Note*>(index.internalPointer());
else
return root;
}
А как мне, зная указатель, сделать из него индекс?
Как мне получше написать, чтобы не обновлять все дерево(reset), а только часть(emit dataChanged)? Либо как запомнить, какие ветки были свернуты/развернуты, чтобы потом восстановить состояние?


Название: Re: [qt4.3.1] Обновление при изменениях в QTreeView+MyModel
Отправлено: denka от Сентябрь 06, 2007, 16:13
А ты смотрел пример из ассистента simpletreemodel? Там как раз используеться иерархическая модель. Если посмотреш реализацию ф-ции index то должен все понять :).
Сворачивать и разворачивать это за тебя сделает QTreeView, если модель написано правильно... Ну это на скока я помню :)



Название: Re: [qt4.3.1] Обновление при изменениях в QTreeView+MyModel
Отправлено: Icoz от Сентябрь 07, 2007, 13:23
ну по большей части я оттуда куски кода и подергал...
У меня другой вопрос. Как правильно задавать эти индексы для обновления. Там же передаются левый-верхний и правый-нижний индексы. При создании индекса передаются значения строки, колонки и указателя.

Колонка у меня всего одна. У меня есть указатель на итем моей структуры. Если я обновляю
индекс родительского итема, то у меня просто отрисовывается продолжение линии (ну той, на которой еще плюсики есть. Она показывает иерархию.), а ниже лежащие итемы ниже не сдвигаются.

Пробовал сделать левый-верхний = парент итема, правый-нижний = следующий сосед парента итема, но тогда прога падает с фразой, что что-то там криво у QList::size().

Какие мысли?

ЗЫ. В этом примере нет setData! А у меня модель редактируеммая. Проблема возникает при добавлении элемента.


Название: Re: [qt4.3.1] Обновление при изменениях в QTreeView+MyModel
Отправлено: Icoz от Сентябрь 07, 2007, 14:23
Еще вопрос: setData может работать не только на обновление данных, но и на добавление/удаление/перемещение? Или это только при помощи UserRole делается?


Название: Re: [qt4.3.1] Обновление при изменениях в QTreeView+MyModel
Отправлено: denka от Сентябрь 07, 2007, 14:37
Добавление и удаление элементов делаеться с помощью ф-ций insertRow, insertRows, insertColumn, insertColumns и группы ф-ций remove. А setData на сколько я понимаю MVC тролей только для обновления. Я сразу не понял о чем ты :). У себя я делал только не редактируемую иерархическую модель.


Название: Re: [qt4.3.1] Обновление при изменениях в QTreeView+MyModel
Отправлено: Icoz от Сентябрь 07, 2007, 14:41
Проблема решена.
Решение простое. Надо было всего лишь вставить в нужные места: beginInsertRows/endInsertRows и beginRemoveRows/endRemoveRows