Пробслема следующая.
Модель пишу сам:
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)? Либо как запомнить, какие ветки были свернуты/развернуты, чтобы потом восстановить состояние?