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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [qt4.3.1] Обновление при изменениях в QTreeView+MyModel  (Прочитано 6898 раз)
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)? Либо как запомнить, какие ветки были свернуты/развернуты, чтобы потом восстановить состояние?
Записан
denka
Гость
« Ответ #1 : Сентябрь 06, 2007, 16:13 »

А ты смотрел пример из ассистента simpletreemodel? Там как раз используеться иерархическая модель. Если посмотреш реализацию ф-ции index то должен все понять Улыбающийся.
Сворачивать и разворачивать это за тебя сделает QTreeView, если модель написано правильно... Ну это на скока я помню Улыбающийся

« Последнее редактирование: Сентябрь 06, 2007, 16:24 от den'ka » Записан
Icoz
Гость
« Ответ #2 : Сентябрь 07, 2007, 13:23 »

ну по большей части я оттуда куски кода и подергал...
У меня другой вопрос. Как правильно задавать эти индексы для обновления. Там же передаются левый-верхний и правый-нижний индексы. При создании индекса передаются значения строки, колонки и указателя.

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

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

Какие мысли?

ЗЫ. В этом примере нет setData! А у меня модель редактируеммая. Проблема возникает при добавлении элемента.
« Последнее редактирование: Сентябрь 07, 2007, 13:55 от Icoz » Записан
Icoz
Гость
« Ответ #3 : Сентябрь 07, 2007, 14:23 »

Еще вопрос: setData может работать не только на обновление данных, но и на добавление/удаление/перемещение? Или это только при помощи UserRole делается?
Записан
denka
Гость
« Ответ #4 : Сентябрь 07, 2007, 14:37 »

Добавление и удаление элементов делаеться с помощью ф-ций insertRow, insertRows, insertColumn, insertColumns и группы ф-ций remove. А setData на сколько я понимаю MVC тролей только для обновления. Я сразу не понял о чем ты Улыбающийся. У себя я делал только не редактируемую иерархическую модель.
« Последнее редактирование: Сентябрь 07, 2007, 14:39 от den'ka » Записан
Icoz
Гость
« Ответ #5 : Сентябрь 07, 2007, 14:41 »

Проблема решена.
Решение простое. Надо было всего лишь вставить в нужные места: beginInsertRows/endInsertRows и beginRemoveRows/endRemoveRows
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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